我正在编写一个小型C程序,使用MinGW的gcc在Windows上编译它。我也在GitHub上托管它(并使用GitHub Desktop for Windows)。但是,GitHub似乎在文件中强制执行UTF-8编码,而Windows终端在处理UTF-8时遇到了麻烦。
经过一番搜索,我发现了一些解决方案,但是他们需要手动的,最终用户风格的解决方案,我想避免(我不打算分发它或任何东西,但我想知道如果我是的话会怎么做)。
目前的工作原理是将编码更改为ANSI并在编译之前手动修复所有内容,但我宁愿避免每次该死的时间都要在Windows上工作。
所以问题是:如何在Windows上编译时处理UTF-8编码的源?
以下是一些示例输出:
[]
编译过程完全相同,唯一不同的是实际的源代码编码。
答案 0 :(得分:1)
问题是由于Windows终端在正常显示UTF-8编码字符时出现问题。
要解决此问题,您需要告知终端使用UTF-8代码页。更改代码页后,您不需要调用setlocale(),因为这可能会弄乱。
要告诉Windows应该使用哪个代码页来显示输出,您可以使用SetConsoleOutputCP函数传递UTF-8代码(65001)作为参数(有关详细信息,请查看MSDN中的“Code Page Identifiers”)
这是一个测试程序:
#include <stdio.h>
#include <locale.h>
#include <windows.h>
int main(void)
{
UINT CODEPAGE_UTF8 = 65001;
UINT CODEPAGE_ORIGINAL = GetConsoleOutputCP();
printf("DEFAULT CODEPAGE, DEFAULT LOCALE: ¶\n");
setlocale(LC_ALL, "");
printf("DEFAULT CODEPAGE, SYSTEM LOCALE: ¶\n");
SetConsoleOutputCP(CODEPAGE_UTF8);
setlocale(LC_ALL, "C");
printf("UTF-8 CODEPAGE, DEFAULT LOCALE: ¶\n");
setlocale(LC_ALL, "");
printf("UTF-8 CODEPAGE, SYSTEM LOCALE: ¶\n");
SetConsoleOutputCP(CODEPAGE_ORIGINAL);
return 0;
}
这是程序输出,使用ANSI编码的源代码编译,UTF-8编码,无BOM(字节顺序标记)和UTF-8分别编写:
[]
警告:互联网上的一些信息表明这只适用于某些字体,特别是Lucida Console。此外,这仅适用于Windows 2000 Professional及更高版本。不过,我认为你不需要触及比现在更古老的东西。