C++ Unicode UTF-16编码

3
我有一个宽字符字符串L"hao123--我的上网主页",需要编码为"hao123--\u6211\u7684\u4E0A\u7F51\u4E3B\u9875"。有人告诉我这种编码形式是用于编码Unicode UTF-16代码点的特殊"%uNNNN"格式。在这个网站上,它告诉我这是JavaScript转义字符。但我不知道如何在C++中进行编码。
是否有任何库可供使用?或者给我一些提示。
感谢我的朋友们!
2个回答

2
将unicode嵌入字符串文字通常不是一个好主意并且不可移植;不能保证wchar_t是16位并且编码是UTF-16。虽然在Windows上的Microsoft Visual C ++ (特定的C ++实现)可能是这种情况,但OS X的GCC(另一种实现)中wchar_t是32位。如果您有某种本地化的字符串常量,最好使用特定编码的配置文件,并将其解释为已使用该编码进行编码。 国际Unicode组件(ICU)库提供了对解释和处理unicode的很好支持。另一个用于在编码格式之间转换(但不解释)的好库是libiconv
编辑:
我可能误解了你的问题……如果问题是您已经有一个UTF-16字符串,并且想要将其转换为“unicode-escape ASCII”(即由“\ u”后跟字符的数字值表示的ASCII字符串),则使用以下伪代码:
对于由UTF-16编码字符串表示的每个代码点:
    如果代码点在范围[0,0x7F]内:
       发出强制转换为char的代码点
    否则:
       发出由代表codepoint的十六进制数字后跟"\u"组成的内容
要获得代码点,有一个非常简单的规则……UTF-16字符串中的每个元素都是一个代码点,除非它是“代理对”的一部分,在这种情况下,它和其后面的元素构成一个单独的代码点。如果是这样,则Unicode标准定义了一种将“前导代理”和“尾随代理”组合成单个代码点的过程。请注意,UTF-8和UTF-16都是可变长度编码……如果未使用可变长度表示,则代码点需要32位。 Unicode转换格式(UTF)FAQ 解释了编码以及如何识别代理对以及如何将它们组合成代码点。

但这是要求,我没有选择,应用程序只能在Windows上运行。有人可以给我一个转换的例子吗?顺便说一下,在这里无法访问ICU网站。谢谢。 - Dan
@Dan,如果你在Windows上使用L"hao123--\x6211\x7684\x4E0A\x7F51\x4E3B\x9875",那么它应该是一个const wchar_t字符串,并且它应该以UTF-16编码...不过你需要弄清楚它是UTF-16LE还是UTF-16BE(即它是小端还是大端)。我猜它会是小端,但你需要自己尝试一下。我不用Windows(我是一个NIX人,而且我对Microsoft故意不遵守IEEE Std. 1003.1以及故意不遵守ISO C99和其他标准感到不太满意),所以你需要在你的系统上尝试一下... - Michael Aaron Safyan
@Dan,如果你将 const wchar_t* 强制转换为 const char*,然后逐个以十六进制数打印每个字节,你得到什么?如果你分享一下这个结果,应该更容易回答你的问题。 - Michael Aaron Safyan
@丹,另外,你说你没有选择的意思是什么?有其他理由可以更喜欢配置文件...例如,它使得在不重新编译整个程序的情况下更改本地化或翻译成为可能...毫无疑问,通过合理的逻辑论证这种方法的优点,你的老板可以被说服,对吧? - Michael Aaron Safyan
因为另一个软件必须使用这种格式的数据。printf 的结果是: 68 0 61 0 6f 0 31 0 32 0 33 0 2d 0 2d 0 11 62 ffffff84 76 a 4e 51 7f 3b 4e 75 ffffff98 0 按任意键继续... - Dan
感谢您的建议,我决定自己编写一个函数来处理它。 - Dan

0
只需使用 \x 代替 \u

我只是将它存储在一个字符串中,如果是x,当然可以更改为u。但是如何进行转换呢?谢谢。 - Dan

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