将资源编码从 Windows 1252 更改为带签名的 UNICODE UTF-8

Dip*_*ong 5 c++ unicode encoding utf-8 visual-c++

我正在开发一个较旧的项目(使用定义的 UNICODE 进行编译),并在 .rc 中遇到了一个问题。例如,静态文本元素包含在 DIALOGEX 资源中定义的 \xe2\x80\x9c\xc2\xa9\xe2\x80\x9d

\n
LTEXT "Copyright \xc2\xa9\xe2\x80\x9d,IDC_COPYRIGHT_STATIC,7,154,110,8\n
Run Code Online (Sandbox Code Playgroud)\n

该资源文件可能是多年前由 MSVC 应用程序向导创建的,并随着每个版本的发布而向前迁移,现在如下所示:

\n
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252) //present for over 10 years \n#endif\n
Run Code Online (Sandbox Code Playgroud)\n

多年来 \xc2\xa9 显示正确,但最近显示为 \xe2\x80\x9c\xc3\x85\xc2\xa9\xe2\x80\x9d 甚至 \xe2\x80\x9c\xc2\xbd\xc2\xbf \xe2\x80\x9d。显然,这是一个编码问题,但我需要在进行更改之前了解如何以及为何进行更改。因此,经过研究,.rc 中的这三个属性在错误和编码中发挥了作用:

\n
    \n
  1. .rc 中是否存在 \xe2\x80\x9c#pragma code_page(\xe2\x80\xa6)\xe2\x80\x9d
  2. \n
  3. 用于使用Encoding \xe2\x80\xa6 保存 .rc 文件的编码
  4. \n
  5. 使用编码保存\xe2\x80\xa6 .rc \xe2\x80\x9cwith签名\xe2\x80\x9d或\xe2\x80\x9c无签名\xe2\x80\x9d(意思是BOM?)
  6. \n
\n

使用编码保存...

\n

作为实证测试,更改 .rc 中的这些内容并查看对话中的结果文本

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
#pragma code_page(\xe2\x80\xa6)使用编码保存签名(BOM)Dlg 中的文本
代码页(1252)原始文件不适用\xc3\x85\xc2\xa9
代码页(1252)视窗1252不适用\xc2\xa9
代码页(1252)UTF-8 65001物料清单\xc3\x85\xc2\xa9
代码页(1252)UTF-8 65001无物料清单\xc3\x85\xc2\xa9
代码页(65001)视窗1252不适用\xc2\xa9
代码页(65001)UTF-8 65001物料清单\xc2\xa9
代码页(65001)UTF-8 65001无物料清单\xc2\xa9
.rc 中没有 code_pageUTF-8 65001物料清单\xc2\xa9
.rc 中没有 code_pageUTF-8 65001无物料清单\xc3\x85\xc2\xa9
\n
\n

我可以显式保存编码为 Windows (1252) 的所有 .rc 文件或编码为带签名的 UNICODE UTF-8(并删除 #pragma code_pages)。特定的错误将会消失,但这是最好的解决方案吗?

\n

看来从 Windows 1252 切换到 UNICODE UTF-8 是向前迈出的一步,也是长期发展的正确方法。这有什么问题吗?或者更好的解决方案?

\n

sig*_*igy 1

Raymond Chen 在一篇博客文章中解释了资源编译器中的编码问题,指出当使用 UTF-8 作为 rc 文件的编码时,不应使用 BOM/签名并包含#pragma code_page(65001).

根据开发者社区问题, v10.0.19505.1001 版本之前的资源编译器存在问题。此修复版本随 Windows SDK 10.0.20348.0 一起提供