'How to display Japanese characters in a Linux Wine message box text?

<<If this question is better posted on Ubuntu or Superuser sites, please let me know.>>

I am building a Windows application on Debian Linux (stable) that runs with Wine.

To begin, I wrote a very simple "Hello, World!" application. It works very well for an English caption and text. However, if I add Japanese text to the caption and text, only the caption correctly displays the Japanese text. The text inside the Windows message box uses Unicode substitution characters (empty rectangles). I Google'd so hard, but I cannot find the answer to this issue. :(

My simple C source code:

/* Working with Strings: https://docs.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings */
/* Ref: https://stackoverflow.com/questions/7424383/what-is-the-difference-between-the-a-and-w-functions-in-the-win32-api */
/* Ref: https://stackoverflow.com/questions/4143110/what-encoding-win32-api-functions-expect */
#define UNICODE 1

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    /* Ref: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox */
    MessageBoxW(NULL,                                               /* [in, optional] HWND    hWnd      */
                TEXT("Hello, world!  ようこそ東京!"),              /* [in, optional] LPCTSTR lpText    */
                TEXT("ようこそ東京 | This is a MessageBox title"),  /* [in, optional] LPCTSTR lpCaption */
                MB_OK | MB_ICONINFORMATION);                        /* [in]           UINT    uType     */
    return 0;
}

I compile this code as: $ x86_64-w64-mingw32-gcc -o ./hello-world.exe ./hello-world.c
I run this code as: $ wine ./hello-world.exe

Output looks like this:

enter image description here

The caption displays correctly, but the message box text does not.

My locale looks like this:

$ locale
LANG=en_HK.UTF-8
LANGUAGE=en_HK:en
LC_CTYPE="en_HK.UTF-8"
LC_NUMERIC="en_HK.UTF-8"
LC_TIME="en_HK.UTF-8"
LC_COLLATE="en_HK.UTF-8"
LC_MONETARY="en_HK.UTF-8"
LC_MESSAGES="en_HK.UTF-8"
LC_PAPER="en_HK.UTF-8"
LC_NAME="en_HK.UTF-8"
LC_ADDRESS="en_HK.UTF-8"
LC_TELEPHONE="en_HK.UTF-8"
LC_MEASUREMENT="en_HK.UTF-8"
LC_IDENTIFICATION="en_HK.UTF-8"
LC_ALL=

I also tried this command, but no improvement: $ LC_ALL=ja_JP.UTF-8 wine ./hello-world.exe

What is the trick to make this work? I assume it is: (a) a missing #define, (b) a missing Debian package, (c) a missing environment variable.

Related question: Would my sample code work on native Win 7 or Win 10?

I also tried:

  • winetricks allfonts but no improvement.


Solution 1:[1]

This answer is the result of further research, so I am answering my own question.

The default font for Message Box Text is probably Tahoma. According to this font database (https://catalog.monotype.com/family/microsoft-corporation/tahoma), Tahoma does not support Japanese.

On recent versions of Microsoft Windows, the default Japanese font is now Meiryo: https://en.wikipedia.org/wiki/Meiryo

  1. Run: winetricks allfonts
  2. Run: winecfg
  3. Select tab Desktop Integration
  4. Select item Message Box Text
  5. Click button Font
  6. Select a Japanese font, e.g., Meiryo

winecfg, tab: Desktop Integration

Now, the message box can correctly display Japanese text.

message box with Japanese text

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 kevinarpe