【问题标题】:Convert utf-8 back to one-byte binary in PHP在 PHP 中将 utf-8 转换回一字节二进制文件
【发布时间】:2013-12-02 15:38:46
【问题描述】:

我有很多图像是从 SQL 转储中导入的,使用 utf-8 编码。因此,在 jpeg 图像的开头,我看到的不是“FF D8 FF E0”,而是“C3 BF C3 98 C3 BF C3 A0”。

我试过 iconv('utf-8', 'iso-8859-1', $data) 但它不能转换整个文件(utf-8 中有字符不能转换为 iso-8859- 1.

如何在不考虑编码的情况下将简单的 utf-8 转换为一字节二进制?

【问题讨论】:

  • 如果图像确实被视为 iso-8859-1 文本并作为 utf-8 文本写入数据库,并且您无法将它们转换回来,那么有些奇怪。它们应该是可逆的 - utf-8 中的 all 字符在 iso-8859-1 中不可表示并不重要,因为 only 字符来自 iso-8859- 1 可能已在源图像中找到,因为它们被处理为 iso-8859-1。哪些角色给你带来了问题?另外,我希望不言而喻,无论编码如何,图像都不应该被视为文本。 :)
  • 如果我是你,我根本不会存储编码为 UTF8 的图像。这解决了这里的所有问题。
  • 你需要知道转换为utf-8时使用的编码
  • @Artur 很遗憾我没有图片原件。
  • @Epsiloncool,你能把其中一张图片放到网上供我们试验吗?从您的示例来看,至少前两个字节似乎已成功且可逆地从 iso-8859-1 或 windows-1252(或其他一些包括 ÿ 和 Ø 的 8 位编码)转换为 utf-8。

标签: php encoding utf-8 iconv utf8-decode


【解决方案1】:

问题是因为 UTF-8 中有一些相同字符的表示形式,称为“非最短”形式。这些字符可以在数学上进行转换,但 iconv 将它们视为错误而不进行转换。

我做了一个简短的函数,它将任何 utf-8 字符的文本转换为 Unicode (UTF-16) 代码点数组。然后通过简单的表格将一些非 ASCII 值重新映射为 ASCII(例如 0x20ac 与 0x80 相同等)。你可以在这里找到完整的代码和重映射表:Converting UTF-8 with non-shortest characters to one-byte encoding

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2021-12-27
    • 2013-10-15
    • 1970-01-01
    • 2015-07-20
    • 2014-05-22
    • 2014-10-26
    • 2016-07-16
    • 2010-11-16
    相关资源
    最近更新 更多