0

我看到了有关该主题的其他问题,但都缺少重要的细节:我想转换\u00252F\u00252F\u05de\u05e8\u05db\u05d6为 utf8。我了解您查看流中的 \u 后跟四个十六进制,然后将其转换为字节。问题如下:

  1. 我听说有时你在后面找 4 个字节,有时在后面找 6 个字节,这是正确的吗?如果是这样,那么您如何确定它是哪个?例如是\u00252F4 字节还是 6 字节?
  2. 在这种情况下\u0025映射到一个字节而不是两个(0x25),为什么?四个十六进制应该代表我应该转换为utf8的utf16吗?
  3. 我如何知道文本应该是文字字符\u0025还是 unicode 序列?这是否意味着必须在流中转义所有反斜杠?
  4. 最后,当我可以使用 iconv 为我做这件事时,我手工做这件事是不是很愚蠢?
4

2 回答 2

2

如果您有可用的iconv接口,您可以简单地将\u0123\uABCD等序列转换为字节数组01 23 AB CD......,用 00 字节后跟 ASCII 字节替换任何未转义的 ASCII 字符,然后iconv使用转换描述符运行数组获得iconv_open("UTF-8", "UTF-16-BE")

当然,您也可以更有效地自己直接处理输入,但这需要阅读和理解 UTF-16 和 UTF-8 的 Unicode 规范。

于 2012-11-30T19:55:46.237 回答
0

在某些约定(如 C++11 字符串文字)中,您解析特定数量的十六进制数字,如 4 个 after\u和 8 个 after \U。这可能是也可能不是您提供的输入的约定,但这似乎是一个合理的猜测。其他样式,例如 C++ \x,您可以在 之后解析尽可能多的十六进制数字\x,这意味着如果您确实想在这些转义字符之一之后立即放置一个文字十六进制数字,则必须跳过一些圈。

获得所有值后,您需要知道它们的编码方式(例如,UTF-16 或 UTF-32)以及您想要的编码方式(例如,UTF-8)。然后,您使用一个函数以新编码创建一个新字符串。您可以编写这样的函数(如果您对这两种编码格式有足够的了解),也可以使用库。一些操作系统可能会提供这样的功能,但您可能希望使用第三方库来实现可移植性。

于 2012-11-30T21:20:45.633 回答