utf-8格式八位字符串的示例

时间:2010-03-22 19:10:03

标签: string utf-8

我正在使用一个函数,它需要一个格式化为utf-8编码的八位字符串的字符串。有人能给我一个utf-8编码的八位字节串的样子吗?

换句话说,如果我将'foo'转换为字节,我得到112,111,111。这些char代码看起来像utf-8编码的八位字节串?它会是“0x70 0x6f 0x6f”吗?

我的问题的上下文是生成openid签名的过程,如openid spec中所述:“消息必须以UTF-8编码以生成字节字符串。”我正在寻找一个这样的例子。

由于

3 个答案:

答案 0 :(得分:2)

没有。 UTF-8字符可以跨越多个字节。如果你想了解UTF-8,你应该从its article on Wikipedia开始,它有一个很好的描述。

答案 1 :(得分:2)

我认为你可能在编写你的例子时犯了一些错误,但无论如何,我的猜测是你真正需要的答案是UTF-8是ASCII的超集(将字符编码为字节的标准方法) )。

因此,如果您将ASCII编码的字符串提供给需要UTF-8编码字符串的函数,它应该可以正常工作。

然而,事实恰恰相反。 UTF-8可以表示很多字符ASCII不能,因此将UTF-8编码的字符串赋予需要ASCII(即“正常”)字符串的函数是危险的(除非你肯定所有的字符都是ASCII子集)。

答案 2 :(得分:1)

字符串“foo”被编码为66 6F 6F,但它几乎是所有 ASCII衍生物中的字符串。这是UTF-8的最大特色之一:向后兼容7位ASCII。如果您只处理ASCII,则无需执行任何特殊操作。

其他字符最多可编码4个字节。具体来说,Unicode代码点的位被分解为其中一种模式:

  • 0xxxxxxx
  • 110xxxxx 10xxxxxx
  • 1110xxxx 10xxxxxx 10xxxxxx
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

要求使用适合的最短序列。因此,例如,欧元符号('€'= U + 20AC =二进制10 000010 101100)编码为1110 0010,10 000010,10 101100 = E2 82 AC。

因此,只需简单地处理字符串中的Unicode代码点并以UTF-8编码每个代码点。

困难的部分是弄清楚字符串的编码方式。大多数现代语言(例如,Java,C#,Python 3.x)具有“字节数组”和“字符串”的不同类型,其中“字符串”始终具有相同的内部编码(UTF-16或UTF-32),并且您如果要将其转换为特定编码中的字节数组,则必须调用“encode”函数。

不幸的是,像C这样的旧语言会混淆“字符”和“字节”。 (IIRC,PHP也是这样,但是我使用它已经有几年了。)即使你的语言确实支持Unicode,你仍然需要处理磁盘文件和带有未指定编码的网页。有关详细信息,请搜索“chardet”。