【问题标题】:How to handle UTF-8 encoded source when compiling on Windows?在 Windows 上编译时如何处理 UTF-8 编码的源代码?
【发布时间】:2017-03-14 22:15:07
【问题描述】:

我目前正在编写一个小型 C 程序,使用 MinGW 的 gcc 在 Windows 上编译它。我还将它托管在 GitHub 上(并使用 GitHub Desktop for Windows)。然而,GitHub 似乎在文件中强制执行 UTF-8 编码,而 Windows 终端无法处理 UTF-8。

经过一番搜索,我找到了一些解决方案,但它们需要手动的、最终用户风格的解决方案,我想避免这种情况(我不打算分发它或其他任何东西,但我想知道如果我是)。

目前的工作是将编码更改为 ANSI 并在编译之前手动修复所有内容,但我宁愿避免每次我想在 Windows 上工作时都必须这样做。

那么问题来了:在 Windows 上编译时如何处理 UTF-8 编码的源代码?


这是一些示例输出:

[]

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

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

【问题讨论】:

  • 我希望我没有遗漏任何相关信息,但如果我遗漏了请询问!
  • gcc 不会自动处理吗?
  • GCC 处理得很好,但问题似乎是由 Windows 终端引起的。显然它只适用于 Lucida Console 字体,但我不想为了让我的程序运行而更改终端字体。
  • @HansPassant 我没有打开任何文件!我的源代码以 UTF-8 编码,编译后的文件在 Windows 上编码不正确。将我的源代码转码为 ANSI 时,一切正常! -- 然而,知道 fopen() 处理编码非常有趣。谢谢!
  • 所以 gcc 在 UTF-8 中编译正常,但 exe 没有运行?究竟出了什么问题?

标签: windows encoding


【解决方案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、不带 BOM(字节顺序标记)的 UTF-8 和带 BOM 的 UTF-8 编码的源代码编译:

[]

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

【讨论】:

  • 非常感谢! SetConsoleOutputCP(65001) 拯救了我的一天!
猜你喜欢
  • 2010-09-21
  • 2023-03-10
  • 2010-12-16
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多