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

如何将Unicode转义字符转换为utf8?,c,encoding,utf-8,C,Encoding,Utf 8,我看到了关于这个主题的其他问题,但所有问题都缺少重要的细节: 我想将\u00252F\u00252F\u05de\u05e8\u05db\u05d6转换为utf8。我知道您在流中查找\u,然后是四个十六进制,并将其转换为字节。问题如下: 我听说有时候你在后面找4个字节,有时候在后面找6个字节,对吗?如果是这样,那么您如何确定它是哪一个?例如,\u00252F是4字节还是6字节 在\u0025的情况下,这映射到一个字节而不是两个字节(0x25),为什么?四个十六进制应该代表utf16,我应该将其转

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


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

  • 如果您有
    iconv
    接口可供使用,您只需将
    \u0123\uABCD
    等序列转换为字节数组
    01 23 AB CD
    …,将任何未转换的ASCII字符替换为后跟ASCII字节的00字节,然后使用由iconv打开(“UTF-8”、“UTF-16-BE”)获得的转换描述符,通过iconv运行数组

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

    在某些约定(如C++11字符串文字)中,您解析特定数量的十六进制数字,例如
    \u
    后面四个和
    \u
    后面八个。对于您提供的输入,这可能是惯例,也可能不是惯例,但这似乎是一个合理的猜测。其他样式,如C++的
    \x
    可以解析在
    \x
    之后可以找到的任意多个十六进制数字,这意味着如果要在其中一个转义字符之后立即放置一个文字十六进制数字,就必须跳过一些环


    一旦你有了所有的值,你需要知道它们是什么编码(例如UTF-16或UTF-32)和你想要什么编码(例如UTF-8)。然后使用函数在新编码中创建新字符串。您可以编写这样一个函数(如果您对这两种编码格式都有足够的了解),也可以使用库。有些操作系统可能提供这样的功能,但为了便于移植,您可能需要使用第三方库。

    “那么您如何确定它是哪一个?”这是我们应该问您的问题。是
    \u00252F
    始终只有一个字符,还是字符U+0025后跟
    2
    (U+0032)后跟
    F
    (U+0046)?“四个十六进制应该代表utf16吗?我应该把它转换成utf8吗?”再说一遍,我们怎么知道?这些数据从何而来?在大多数使用
    \u
    的转义系统中,正好4个十六进制数字必须跟在
    \u
    后面,并被视为构成一个UTF-16代码单元。@R.MartinhoFernandes我从解析的角度提出这个问题,我看到数据
    \u0025f
    如何确定它是
    \u0025
    +2F还是
    \u0025f
    ?@chacham15,这取决于控制输入格式的规范。基本上,u00252F不代表任何一种情况;它表示反斜杠字符,后跟小写u,后跟数字0、0、2、5、2和字母F。因此,请根据我的问题回答:1:始终为4字节,2:为utf16,3:是,4:仅转义utf16字符。对吗?第一。这取决于你输入的格式,你必须知道。2.它几乎肯定是UTF-16,但这也取决于输入的格式。3.同样,这取决于输入的格式。如果你知道
    \u
    将被解释为逃避,我会告诉你该怎么做,但这可能是一个错误的假设。4.没有标准的方法来
    iconv
    直接使用转义表单;一些iconv的实现可能直接支持它作为输入,但我不会在可移植的程序中依赖它。好吧,这更有意义。你的意思是,这种转义是一种常见的模式,可以将许多不同的格式转义为ascii,为了将其转换为utf8,我需要知道哪种格式转义为ascii?是的。例如,C99有一个
    \u
    ,Java有一个
    \u
    ,JavaScript有一个
    \u
    ,JSON有一个
    \u
    (可能与JavaScript兼容),等等……第一句话是错误的。C++ 11字符串文字在代码> > u <代码>之后,完全考虑四位,在代码> > u <代码>之后,精确地八位,尽可能多地在<代码> \x .@ r.MaTiHuffeNordes:谢谢。我把
    \x
    \u
    \u
    混淆了。我已经更正了答案。