返回 2026-05-08
⚙️ 工程

将资源字符串升级到 Unicode 时,别忘了加上 L 前缀When you upgrade your resource strings to Unicode, don’t forget to specify the L prefix

文章提醒开发者在将资源字符串从 ANSI 升级到 Unicode 时,必须显式添加 L 前缀(如 L"text"),否则字符串会被隐式转换回 8 位代码页,导致非 ASCII 字符显示错误。作者通过实际案例说明省略 L 前缀会引发本地化问题,尤其是在多语言环境中。该建议适用于 Windows 平台下的 C/C++ 资源文件处理。核心结论是:使用 Unicode 字符串时必须加 L 前缀以避免编码降级。

Raymond Chen

2026年5月7日

0 条回复

不久前,我曾讨论过资源编译器(Resource Compiler)默认使用 CP_ACP,即便文件有细微的 UTF-8 编码提示也是如此。

在又一次发生 Visual Studio 悄悄将文件编码从 1252 改为 UTF-8 并导致所有非 ASCII 字符串出错的事件之后,再加上 Azure DevOps 和 Visual Studio 在显示差异时完全忽略编码变化,一位同事决定彻底解决问题:他改用显式的 Unicode 转义序列 \x#### 来表示非 ASCII 字符。这样一来,无论文件是 1252 还是 UTF-8 编码都无所谓,因为这两种代码页在 ASCII 子集上是一致的。

原本是这样的:

IDS_AWESOME "That’s great!"

被改成了

IDS_AWESOME "That\x2019s great!"

但屏幕上显示的字符串却是

“That’s great!”

哪里出错了?

如果你要在字符串中嵌入 Unicode 字符,必须给字符串加上 L 前缀。否则,\xABCD 序列会被解释为一个 8 位的 \xAB 转义序列,后面跟着两个字面字符 CD。在这个例子中,\x2019 被解释为 \x20(表示一个空格),然后是字面字符 19,结果就成了 That␣19s great!。

正确的写法应该包含 L 前缀。

IDS_AWESOME L"That\x2019s great!"

作者

Raymond 参与 Windows 的发展已超过 30 年。2003 年,他开始运营一个名为 The Old New Thing 的网站,其受欢迎程度远超他的想象,至今仍让他感到有些不安。该网站催生了一本同名书籍《The Old New Thing》(Addison Wesley, 2007)。他偶尔会在 Windows Dev Docs 的 Twitter 账号上出现,讲述一些毫无实用价值的故事。

保持关注

有新文章发布时通知我。

关注此博客

需要完整排版与评论请前往来源站点阅读。