资源文件是以UNICODE还是ANSI代码页编译的?

11

首先,如果这个问题已经被回答了一百遍,请原谅我的无知!

但是我的搜索能力似乎很糟糕,因为我无法回答这个基本问题:

资源是以什么形式存储在EXE/DLL中的?使用UNICODE(UCS-2,Windows本地内部字符格式),还是使用资源块的代码页作为多字节字符?

  • 如何在资源(.rc)中嵌入UNICODE字符串?
  • 可以在VS 2012内插入UNICODE(UCS-2)文本到语言字符串中吗?
  • Windows仍然使用UCS-2,还是内部使用UTF16?

我只是想要一般性的答案或者详细信息的链接,而不是关于如何将UNICODE字符串放入.rc字符串表的详细说明。谢谢!


2
这与您的问题并不直接相关,但自Windows 2000以来,Windows的内部字符格式为UTF-16。 UTF-16和UCS-2之间的差异很少,但它们确实存在。 - kusma
3个回答

7

WIN32中的所有资源字符串都编译为Unicode。有关详细信息,请参见此处。.rc脚本本身可以是ANSI(使用本地代码页)或带有适当BOM的UCS-2 (参考)。


感谢您的编辑,Deanna。我正要粘贴进去。 - WhozCraig
所以,归根结底,EXE/DLL项目设置为MBCS还是UNICODE并不重要 - EXE/DLL中的二进制资源(如对话框、字符串表等)都是以UNICODE格式存在的? - Mordachai
RC脚本支持Unicode字符串,但Visual Studio中的RC编辑器呢?我能否从RC编辑器输入同时包含阿拉伯和希伯来符号的字符串? - Dialecticus
引用资源编译器文档中的话:“Win32 资源编译器可以处理 Unicode 编码的文件,但您需要使用启用了 Unicode 的编辑器创建这样的文件。” 我工作中使用的本地化团队通常使用自己支持所翻译语言并设置文件开头的字节顺序标记(BOM)的编辑器。顺便说一句,Notepad 也支持此功能(通常会让在代码中读取以 Unicode 编码保存的文本文件时感到非常沮丧)。 - WhozCraig
1
为了澄清我的早前评论,当文件以ANSI格式保存时,代码页只会被保存并使用。在处理UCS-2文件时根本不需要它。 - Deanna
显示剩余2条评论

3

如果有疑问,可以查看十六进制。这里是notepad.exe的rc文件的开头,使用UTF16编码:

0002ed60  01 00 53 00 74 00 72 00  69 00 6e 00 67 00 46 00  |..S.t.r.i.n.g.F.|
0002ed70  69 00 6c 00 65 00 49 00  6e 00 66 00 6f 00 00 00  |i.l.e.I.n.f.o...|
0002ed80  a6 02 00 00 01 00 30 00  34 00 30 00 39 00 30 00  |......0.4.0.9.0.|
0002ed90  34 00 42 00 30 00 00 00  4c 00 16 00 01 00 43 00  |4.B.0...L.....C.|
0002eda0  6f 00 6d 00 70 00 61 00  6e 00 79 00 4e 00 61 00  |o.m.p.a.n.y.N.a.|
0002edb0  6d 00 65 00 00 00 00 00  4d 00 69 00 63 00 72 00  |m.e.....M.i.c.r.|
0002edc0  6f 00 73 00 6f 00 66 00  74 00 20 00 43 00 6f 00  |o.s.o.f.t. .C.o.|
0002edd0  72 00 70 00 6f 00 72 00  61 00 74 00 69 00 6f 00  |r.p.o.r.a.t.i.o.|

2
这并没有回答问题。问题是,Unicode字符是否可以放置在.rc文件中。你不能通过查看资源编译器的输出来回答这个问题。此外,十六进制转储中没有任何内容标识UTF-16。这同样可能是UCS-2。 - IInspectable

2

请阅读“[答案]”和“仅链接答案 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接