3

我有一个宽字符字符串是L"hao123--我的上网主页",必须编码为"hao123--\u6211\u7684\u4E0A\u7F51\u4E3B\u9875"。有人告诉我,编码字符串是一种特殊的“%uNNNN”格式,用于编码 Unicode UTF-16 代码点。在这个网站上,它告诉我它是 JavaScript 转义。但我不知道如何用 C++ 对其进行编码。

有什么图书馆可以让它工作吗?或者给我一些提示。

谢谢我的朋友们!

4

2 回答 2

2

在字符串文字中嵌入 unicode 通常不是一个好主意,而且不可移植;不保证 wchar_t 为 16 位,编码为 UTF-16。虽然在使用 Microsoft Visual C++(一种特定的 C++ 实现)的 Windows 上可能是这种情况,但 wchar_t 在 OS X 的 GCC(另一种实现)上是 32 位的。如果您有某种本地化字符串常量,最好使用某种特定编码的配置文件,并将它们解释为已以该编码编码。Unicode国际组件 (ICU)库为解释和处理 unicode 提供了很好的支持。另一个用于在(但不解释)编码格式之间转换的好库是libiconv

编辑
我可能误解了您的问题...如果问题是您已经有一个 UTF-16 字符串,并且您想将其转换为“unicode-escape ASCII”(即表示 unicode 字符的 ASCII 字符串由 "\u" 后跟字符的数值),然后使用以下伪代码:

对于由 UTF-16 编码字符串表示的每个代码点:
    如果代码点在 [0,0x7F] 范围内:
       发出转换为 char 的代码点
    别的:
       发出“\u”后跟表示代码点的十六进制数字

现在,要获得代码点,有一个非常简单的规则...... UTF-16 字符串中的每个元素都是一个代码点,除非它是“代理对”的一部分,在这种情况下,它和它后面的元素组成一个单个代码点。如果是这样,则 unicode 标准定义了将“前导代理”和“尾随代理”组合成单个代码点的过程。请注意,UTF-8 和 UTF-16 都是可变长度编码……如果不以可变长度表示,代码点需要 32 位。Unicode 转换格式 (UTF) 常见问题解答解释了编码以及如何识别代理对以及如何将它们组合成代码点。

于 2010-04-21T02:48:20.503 回答
0

只需使用\x而不是\u.

于 2010-04-21T02:48:02.870 回答