如何将Unicode转义字符转换为utf8?

时间:2012-11-30 19:47:44

标签: c encoding utf-8

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

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

2 个答案:

答案 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)。然后,您可以使用函数在新编码中创建新字符串。您可以编写这样的函数(如果您对两种编码格式都了解得足够多),或者您可以使用库。某些操作系统可能提供此类功能,但您可能希望使用第三方库来实现可移植性。