【问题标题】:Universal and clean UTF-8 encoding (PHP)通用且干净的 UTF-8 编码 (PHP)
【发布时间】:2012-01-16 00:34:19
【问题描述】:

我希望能够在一次调用中从 any 字符集转换为干净的 UTF-8(我们使用的是 PHP)。

用于 Apache Solr 索引;问题是 Solr 使用的 XML Parser(用 Java 编写)在遇到非法 UTF-8 时会抛出异常。

我们尝试了 iconv(),但它有时会在警告后剪切字符串,丢失一些数据,即使启用了 //TRANSLIT 和/或 //IGNORE

utf8_encode() 仅适用于 latin1。

我们正在使用多种编码从多个来源导入许多文档,我们需要一个完全干净的 UTF-8 输出。 我们不关心时间/资源问题。

感谢您的明智回答!

【问题讨论】:

  • 也许尝试解决iconv 的问题会很有成效?另外,你试过mb_convert_encoding吗?
  • 每当我遇到这两个函数的问题时,我都会尝试使用 htmlentities,然后尝试使用 utf-8 编码的 html_entity_decode。这是一种解决方法,但也可能只适合您的情况。
  • @Jon :我们有一个函数可以做到这一点,但它很脏,我们很确定它不完整。我们需要 100% 测试和批准的东西。如果我们碰巧以某种方式改变了我们的修复,我们将不得不重新索引我们的数据。此外, mb_convert_encoding 需要一个输入字符集;我们正在寻找一种通用转换器。
  • @CiprianMocanu:所以你一个接一个地使用这两个函数?这种技术可以静默消除非法 UTF-8 字符吗?
  • @user1087972 它应该消除非法的 UTF-8 字符,如果没有,那么 preg_replace 从那个字符串中取出!

标签: php encoding utf-8 character-encoding solr


【解决方案1】:
  • 您可以尝试改用mb_convert_encodingmb_detect_encoding
  • 在导入这些文档时,您确实需要内容编码或其他东西。如果您从 Web 建立索引,请查找内容类型标头和实际 HTML 文件的内容。始终将此作为您的主要来源 - 可能会退回到检测,但检测实际上只是猜测
  • 如果这两个选项没有帮助,我建议您编写自己的代码来检测流中的无效字符。然后只需替换这些并使用iconv()

出现错误后iconv 不继续的原因非常简单:在某些字符编码中,正确读取字节很重要,因为一个字符可能基于多个字节。 UTF-8 通过使用位掩码来检测字符何时完成来弥补这一点,但并非所有编码都有这个。在这种编码中,单个字节错误意味着字符串的其余部分可能会出现乱码,这不是您想要的。 (我不完全确定,但您应该能够通过采用 UTF-16 字符串并删除文件中的第五个字节来复制它)

嘿,我什至会说明这个问题 :-) 下面是一个(某种)UTF-16 示例,每个字符使用 2 个字节。

[74 00] [65 00] [73 00] [74 00] = test

现在让我们删除一个字节 - 这里是第一个 0x00

[74 65] [00 73] [00 74] [00] = ....

我不知道它实际上会变成什么,但正如你所看到的,它只是在缺少一个字节的那一刻打破了字符串的其余部分。如果你幸运的话,你会用中文索引。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2011-02-15
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多