【问题标题】:PHP UTF-8 encoding problem of U+009AU+009A的PHP UTF-8编码问题
【发布时间】:2009-07-16 10:29:17
【问题描述】:

我在显示 U+009A 的 Unicode 字符时遇到问题。

它应该看起来像“š”,但看起来像一个矩形块,里面有数字 009A。

将其转换为实体“š”正确显示字符,但我不想在数据库中存储实体。

网页的编码是UTF-8。

该字符被 URL 编码为“%C2%9A”。

再现: # php -E 'echo urldecode("%C2%9A");' > /tmp/测试;少 /tmp/test

这给了我 in less 或 in vim.

【问题讨论】:

    标签: php encoding utf-8


    【解决方案1】:

    Unicode 字符“š”是 U+0161,而不是 U+009A

    我怀疑它是另一个字符集中的 0x9A。

    当您没有安装带有该字符的字体时,通常会显示带有 009A 的框。

    【讨论】:

    • 也许这更有意义。内容很可能是从 Word 中复制的,随之而来的是所有奇怪的东西......这给了我我需要的东西: html_entity_decode("š", ENT_COMPAT, "UTF-8");但是,这些字符更多,所以我需要一个映射或一种在它们之间进行转换的方法
    • 感谢您的提示,Gumbo。以下代码解决了我的问题(不知何故,我首先需要 utf8_decode,但我猜 XML 提要也是 UTF-8 编码的): $_output = utf8_decode($_output); $_output = mb_convert_encoding($_output, 'UTF-8', 'windows-1252');
    【解决方案2】:

    如果您使用 UTF-8 作为输入编码,那么您可以简单地使用纯 š。或者您可以使用独立于输入编码的十六进制表示 "\xC2\x9A"(双引号)。或者 utf8_encode("\x9A"),因为 Unicode 和 ISO 8859-1 的前 256 个字符是相同的。

    【讨论】:

    • 这给了我和以前一样的结果:# php -E 'echo utf8_encode("\x9A");回声“\n”;' > /tmp/测试;少 /tmp/test
    【解决方案3】:

    如果我对 echo urldecode("%C2%9A"); 的输出进行十六进制转储,我会得到 c2 9a,这是字符 0x9a 的正确 UTF-8 编码。

    你从utf8_encode("\x9A")的输出中得到相同的编码

    当我尝试查看 Unicode 字符 0x9a 时,我也看到了一个方框 - 怀疑它不是您认为应该的字符(啊哈:正如 Azquelt 所发布的,Unicode 字符“š”是 U+0161,而不是 U+ 009A)

    【讨论】:

    • 我得到“9ac2”,但我猜这与大/小端序有关?我已经在 Ubuntu i686 和 RedHat4 i686 上对此进行了测试。 $ php -E 'echo urldecode("%C2%9A");' > /tmp/测试; od -t x2 /tmp/test 0000000 9ac2 0000002
    【解决方案4】:

    Codeigniter 在 Etisalat 等托管服务器中存在 utf-8 字符输入数据保存问题。 system/core/Utf8.php 具有检测输入数据(post/get)中非法字符的功能。在某些情况下 utf-8 char 被认为是非法的并且保存功能将失败。为了避免数据保存问题,请在第 85 行的 Utf8.php 的 clean_string() 函数中执行以下操作。

    $str = !mb_detect_encoding($str, 'UTF-8', TRUE) ? utf8_encode($str) : $str;

    $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多