我在将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,但当我打开此文件时,我仍然收到以下错误:
UTF解析错误:输入不是正确的
-8,请指示编码!字节: 0x04 0x50 0x72 0x65
有没有合适的方法可以将它转换成可读的UTF-8,或者这意味着文件中仍然有一些符号不在UTF-8上?
发布于 2018-08-15 22:14:54
您正在尝试将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);
根据ISO CP-1257不是其中之一,您可以使用mb supported encodings -8859-13来代替,但是请注意,在某些图形字符中,它们之间存在一些不一致(然而,根据wikipedia,语言字符似乎是一致的)
https://stackoverflow.com/questions/51860141
复制相似问题