我看到了有关该主题的其他问题,但所有问题都缺少重要细节:
我想将\u00252F\u00252F\u05de\u05e8\u05db\u05d6
转换为utf8。我知道你通过流查看\ u后跟四个十六进制转换为字节。问题如下:
\u00252F
4或6个字节?\u0025
的情况下,这映射到一个字节而不是两个(0x25),为什么?是否应该将四个十六进制表示为utf16,我应该将其转换为utf8?\u0025
还是unicode序列?这是否意味着必须在流中转义所有反斜杠?答案 0 :(得分:2)
如果您拥有iconv
接口,则只需将\u0123\uABCD
等序列转换为字节数组01 23 AB CD
...,将任何未转义的ASCII字符替换为一个00字节后跟ASCII字节,然后通过iconv
运行数组,其转换描述符由iconv_open("UTF-8", "UTF-16-BE")
获得。
当然,您也可以更高效地直接使用输入,但这需要阅读并理解UTF-16和UTF-8的Unicode规范。
答案 1 :(得分:0)
在某些约定(如C ++ 11字符串文字)中,您解析特定数量的十六进制数字,例如\u
之后的四位数和\U
之后的八位数字。这可能是也可能不是您提供的输入的约定,但似乎是一个合理的猜测。其他样式,比如C ++的\x
你可以解析\x
之后可以找到的十六进制数字,这意味着如果你想在之后立即输入一个字母十六进制数字,你必须跳过一些箍其中一个逃脱的角色。
获得所有值后,您需要知道它们所处的编码(例如,UTF-16或UTF-32)以及您想要的编码(例如,UTF-8)。然后,您可以使用函数在新编码中创建新字符串。您可以编写这样的函数(如果您对两种编码格式都了解得足够多),或者您可以使用库。某些操作系统可能提供此类功能,但您可能希望使用第三方库来实现可移植性。