【问题标题】:PHP encoding Windows-1257 to UTF-8 errorPHP 将 Windows-1257 编码为 UTF-8 错误
【发布时间】:2019-01-22 09:58:47
【问题描述】:

我在将 Windows-1257 文件转换为 UTF-8 时遇到了问题。原文件有 <?xml version="1.0" encoding="windows-1257"?> 在顶部,我尝试使用以下代码对其进行转换:

iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");

$baltic_xml = file_get_contents($remote_file);
$unicode_xml = iconv("UTF-8", "UTF-8//IGNORE", $baltic_xml);
file_put_contents('data/rmtools/import/utf8/'.$files_single, $unicode_xml);

它将文件保存为 UTF-8,但是当我打开这个文件时,我仍然收到错误:

XML 解析错误:输入不是正确的 UTF-8,表示编码!字节数:0x04 0x50 0x72 0x65

是否有任何适当的方法可以将其转换为可读的 UTF-8,或者这意味着文件中仍有一些符号不在 UTF-8 上?

【问题讨论】:

    标签: php encoding utf-8 converter


    【解决方案1】:

    您正在尝试将UTF8 转换为UTF8//IGNORE,这就是您收到该错误的原因。第一个参数是 in_charset。 iconv on PHP.net请改

    $unicode_xml = iconv("UTF-8", "UTF-8//IGNORE", $baltic_xml);
    

    $unicode_xml = iconv("CP1257", "UTF-8//IGNORE", $baltic_xml);
    

    但是我个人建议您使用mb_*,因为 iconv 很大程度上依赖于您的操作系统对 iconv 的实现,并且可以显示操作系统之间的差异,另一方面,mb_* 是纯 php 扩展并且是一致的。让您的代码使用 mb_* 将整个更改为

    ini_set('mbstring.substitute_character','none'); //to remove the unknown characters, in place of //IGNORE in iconv
    $baltic_xml = file_get_contents($remote_file);
    $unicode_xml = iconv("UTF-8", "UTF-8//IGNORE", $baltic_xml);
    $unicode_xml = utf8_encode($unicode_xml); //to correct utf-8 bytes
    $unicode_xml = preg_replace('/[^\PC\s]/u', '', $unicode_xml); //to remove control chars in case it has
    file_put_contents('data/rmtools/import/utf8/' . $files_single, $unicode_xml);
    

    根据mb supported encodingsCP-1257 不是其中之一,您可以使用 ISO-8859-13 代替,但是请注意它们之间在某些图形字符(语言然而,根据wikipedia,字符似乎是一致的)

    【讨论】:

    • 谢谢,不过还是报错,这次是: XML parsing error: encoder error 好像不能读取一些UTF-8符号。错误看起来像:d.pr/free/i/gcjyJX 那个符号是立陶宛字符,应该在 UTF-8 编码上可用。
    • 我已经更新了我的答案,向您展示了另一种方法。我希望这会对你有所帮助。
    • 据我了解,mb_convert_encoding 函数不支持CP1257? php.net/manual/en/mbstring.supported-encodings.php 我收到一个未知的编码错误。
    • 你可能是对的。不如改用 ISO-8859-13,应该够用了
    • P.S.我使用记事本++来检查xml文件。它显示带有图形图标的控制字符,这就是我注意到它们的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多