我希望能够在一次调用中将任何 字符集转换为干净的 UTF-8(我们使用的是 PHP)。
用于 Apache Solr 索引;问题是 Solr 使用的 XML 解析器(用 Java 编写)在遇到非法 UTF-8 时抛出异常。
我们尝试了 iconv() 但它有时会在警告后截断字符串,丢失一些数据,即使启用了 //TRANSLIT 和/或 //IGNORE。
utf8_encode() 仅适用于 latin1。
我们使用多种编码从多种来源导入多种文档,我们需要完全干净的 UTF-8 输出。 我们不关心时间/资源问题。
感谢您明智的回答!
最佳答案
- 您可以尝试使用
mb_convert_encoding
和mb_detect_encoding
。 - 导入这些文档时,您确实需要内容编码之类的东西。如果您从 Web 建立索引,请查找内容类型 header 和实际 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] = ....
我不知道它实际上会变成什么,但正如您所看到的,它只是在缺少一个字节的那一刻将字符串的其余部分打散。如果你幸运的话,你会用中文编制索引。
关于php - 通用且干净的 UTF-8 编码 (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433265/