我学到了什么:
print()
和wprintf()
之一(因为stream一定不能是面向字节的.%s
应与 char *
一起使用,而 %ls
与 wchar_t *
.setlocale()
应该在使用 wchar_t
之前调用,因为 wcstombs()
基于语言环境。wchar_t
是多字节的(MinGW 2 bytes,gcc 4 bytes)我在gcc上克服了困难,但是MinGW的结果太奇怪了
以汉字“你好”为例
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <locale.h>
int main()
{
system("chcp 65001"); // set console to UTF-8
// setlocale(LC_ALL, "zh_CN.UTF-8"); // usually on linux, may be effect
// setlocale(LC_ALL, "chinese"); // according to MSDN
printf("1 %s \n", "Hello你好");
printf("2 %ls \n", L"Hello你好");
wprintf(L"3 %s \n", "Hello你好");
wprintf(L"4 %ls \n", L"Hello你好");
}
如果不指定语言环境,则输出:
Active code page: 65001
1 Hello你好
2 Hello
3 Hello你好
4 Hello
如果使用
zh_CN.UTF-8
,输出与上面相同。
和
setlocale(LC_ALL, "chinese")
:
Active code page: 65001
1 Hello
2 Hello
3 Hello浣犲ソ
4 Hello你好
在 Linux 上,每个输出都是预期的。
在 Windows 上输出很奇怪,
printf
和 wprintf
甚至可以一起使用(在 linux 上不可能)。我不知道如何理解这个问题。
我只是希望让我的代码既跨平台又国际化。