【问题标题】:example of a utf-8 format octet stringutf-8 格式八位字节字符串的示例
【发布时间】:2010-03-22 19:10:03
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 如果 'f' > 'o',您使用的字符编码很奇怪。我假设您的意思是 [102, 111, 111]。

标签: string utf-8


【解决方案1】:

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

【讨论】:

  • 谢谢。维基百科的文章是我最先看的地方之一。我想我可能只是对术语感到困惑。如果我通过 php 的 utf8_encode 运行一个字符串,输出可以描述为一个 utf8 编码的字节字符串吗?我的问题的上下文是生成 openid 签名的过程,如 openid 规范 (openid.net/specs/openid-authentication-2_0.html#kvform) 中所述:“消息必须以 UTF-8 编码以生成字节字符串。”我正在寻找一个这样的例子。
  • 我不熟悉 PHP 对 UTF-8 的处理。对不起。
  • 如果字符串以 ISO-8859-1 编码,utf8_encode(the_string) 将给出正确的结果。
【解决方案2】:

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

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

然而,事实并非如此。 UTF-8 可以表示很多 ASCII 不能表示的字符,因此将 UTF-8 编码的字符串提供给需要 ASCII(即“正常”)字符串的函数是危险的(除非您确定所有字符都是ASCII 子集)。

【讨论】:

  • 谢谢。我试图描述对我不完全理解的东西的需求。我正在编写一个 javascript openid 签名生成器。 openid 规范声明“消息(要签名)必须以 UTF-8 编码以生成字节字符串。”我正在寻找一个与语言无关的示例来说明这种字符串的外观。再次感谢。
【解决方案3】:

字符串“foo”被编码为 66 6F 6F,但几乎所有 ASCII 派生词都是这样。这是 UTF-8 的最大特性之一:向后兼容 7 位 ASCII。如果你只处理 ASCII,你不需要做任何特别的事情。

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

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

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

因此,只需遍历字符串中的 Unicode 代码点,然后用 UTF-8 对每个代码点进行编码。

最难的部分是弄清楚你的字符串是从什么编码开始的。大多数现代语言(例如 Java、C#、Python 3.x)对“字节数组”和“字符串”都有不同的类型,其中“字符串”总是具有相同的内部编码(UTF-16 或 UTF-32),而您如果要将其转换为特定编码的字节数组,则必须调用“编码”函数。

不幸的是,像 C 这样的旧语言将“字符”和“字节”混为一谈。 (IIRC,PHP 也是这样,但我使用它已经有几年了。)即使您的语言确实支持 Unicode,您仍然必须处理未指定编码的磁盘文件和网页。更多详情,请搜索“chardet”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2011-06-17
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多