在Windows上编译时如何处理UTF-8编码的源代码?

时间:2017-03-13 16:48:37

标签: windows encoding

我正在编写一个小型C程序,使用MinGW的gcc在Windows上编译它。我也在GitHub上托管它(并使用Gi​​tHub Desktop for Windows)。但是,GitHub似乎在文件中强制执行UTF-8编码,而Windows终端在处理UTF-8时遇到了麻烦。

经过一番搜索,我发现了一些解决方案,但是他们需要手动的,最终用户风格的解决方案,我想避免(我不打算分发它或任何东西,但我想知道如果我是的话会怎么做)。

目前的工作原理是将编码更改为ANSI并在编译之前手动修复所有内容,但我宁愿避免每次该死的时间都要在Windows上工作。

所以问题是:如何在Windows上编译时处理UTF-8编码的源?

以下是一些示例输出:

[Screenshot]

  • 左:源代码以UTF-8编码(显示错误)。
  • 右:用ANSI编码的源代码(右侧显示)。

编译过程完全相同,唯一不同的是实际的源代码编码。

1 个答案:

答案 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分别编写:

[TEST OUTPUT]

警告:互联网上的一些信息表明这只适用于某些字体,特别是Lucida Console。此外,这仅适用于Windows 2000 Professional及更高版本。不过,我认为你不需要触及比现在更古老的东西。