【发布时间】:2023-03-14 18:31:02
【问题描述】:
我在 C++ 文件(Visual Studio 2019,MFC 项目)中确实有那个简单的 coden-p
CString teststr = _T("täst"); //second letter is a german "Umlaut"
TRACE(_T("\n%s: %d"), static_cast<LPCTSTR>(teststr), teststr.GetLength());
VS 中源文件的默认编码是“西欧 (Windows) - 代码页 1252” - 至少在我的系统上是这样。
TRACE 为我提供了正确的文本和正确的长度 (4)。
但是,我想将 sourcefiles-encoding 更改为 UTF-8,以便将来能够独立于开发人员语言。
如果我将编码更改为“Unicode (UTF-8 with signature) - Codepage 65001)”,它仍然没问题,除了源文件有一个 BOM - 这是我不喜欢的。
当我将源代码保存为“Unicode (UTF-8 without signature) - Codepage 65001)”(这是我想使用的编码)时,真正的问题出现了。当我这样做时,源文件在编辑器中看起来仍然很好,但 TRACE 给了我:"täst: 5" 哪个原因是可怕的错误,并且是生产代码中可怕的错误和崩溃的来源。
所以问题是:如何在没有 BOM 的情况下将源代码保存为 UTF-8 并且仍然可以使用?是否有任何设置或扩展可能对此有所帮助?
【问题讨论】:
-
TRACE必须进行窄到宽的字符串转换。标准 MFC 工具使用MultiByteToWideChar(CP_ACP,...),而不是MultiByteToWideChar(CP_UTF8,...),即它们假定窄字符串在“ANSI 代码页”中;但你的字符串实际上是 UTF-8。因此,您会在“调试”窗口中得到难以理解的输出。 -
其实,没有。假设您进行 Unicode 构建,代码实际上是
CStringW s = L"täst";,它取决于 编译器 如何将源代码字符串转换为宽字符串。很有可能它还假设源文件在 CP1252 中。 -
“源文件得到一个 BOM - 我不喜欢的东西” - 你为什么要避免这个解决方案?这是你真正想要的。 BOM 明确地标识了文档的编码,任何消费者都可以从那里获取它。
标签: utf-8 mfc visual-studio-2019