I’m trying to print out a wchar_t* string.
Code goes below:
#include <stdio.h>
#include <string.h>
#include <wchar.h>
char *ascii_ = "中日友好"; //line-1
wchar_t *wchar_ = L"中日友好"; //line-2
int main()
{
printf("ascii_: %s\n", ascii_); //line-3
wprintf(L"wchar_: %s\n", wchar_); //line-4
return 0;
}
//Output
ascii_: 中日友好
Question:
-
Apparently I should not assign CJK characters to char* pointer in line-1, but I just did it, and the output of line-3 is correct, So why? How could printf() in line-3 give me the non-ascii characters? Does it know the encoding somehow?
-
I assume the code in line-2 and line-4 are correct, but why I didn’t get any output of line-4?
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 theprintf). After that thewprintfwill not work due the incorrect orientation.In other words, once you use
printf()you need to keep on usingprintf(). Similarly, if you start withwprintf(), you need to keep usingwprintf().You cannot intermix
printf()andwprintf(). (except on Windows)EDIT:
To answer the question about why the
wprintfline doesn’t work even by itself. It’s probably because the code is being compiled so that the UTF-8 format of中日友好is stored intowchar_. However,wchar_tneeds 4-byte unicode encoding. (2-bytes in Windows)So there’s two options that I can think of:
wchar_t, and just stick with multi-bytechars. This is the easy way, but may break if the user’s system is not set to the Chinese locale.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.