First of all, it's usually not a good idea to use non-ascii characters in source code. What's probably happening is that the chinese characters are being encoded as UTF-8 which works with ascii.
Now, as for why the wprintf()
isn't working. This has to do with stream orientation. Each stream can only be set to either normal or wide. Once set, it cannot be changed. It is set the first time it is used. (which is ascii due to the printf
). After that the wprintf
will not work due the incorrect orientation.
In other words, once you use printf()
you need to keep on using printf()
. Similarly, if you start with wprintf()
, you need to keep using wprintf()
.
You cannot intermix printf()
and wprintf()
. (except on Windows)
EDIT:
To answer the question about why the wprintf
line doesn't work even by itself. It's probably because the code is being compiled so that the UTF-8 format of 中日友好
is stored into wchar_
. However, wchar_t
needs 4-byte unicode encoding. (2-bytes in Windows)
So there's two options that I can think of:
- Don't bother with
wchar_t
, and just stick with multi-byte char
s. This is the easy way, but may break if the user's system is not set to the Chinese locale.
- Use
wchar_t
, but you will need to encode the Chinese characters using unicode escape sequences. This will obviously make it unreadable in the source code, but it will work on any machine that can print Chinese character fonts regardless of the locale.