我有一个 test.HIO 文件的内容:
11/08/2015 00:05:50»ЦО Ворота выход»Дверь не открыта»24001695»Бахром Суннатуллоевич Тургунов»99»»»
11/08/2015 00:05:54»ЦО Ворота выход»Верный доступ»24001215»Шохрух Джохонгирович Исламов»99»»»
如果我使用linux命令 file -i test.HIO ,我会收到以下信息:
test.HI0: text/plain; charset=iso-8859-1
如果我转换此文件使用php函数 iconv 或 mb_convert_encoding :
$file_content = file( "test.HIO" );
// for example i get one line from file
$str = iconv( "ISO-8859-1", "UTF-8", $file_content[2] );
var_dump( $str );
$str2 = mb_convert_encoding( $file_content[2], "UTF-8", "ISO-8859-1" );
var_dump( $str2 );
我得到了相同的结果:
string(159) " 11/08/2015 00:05:45»ÖÎ Âîðîòà âûõîä»Âåðíûé äîñòóï»24001695»Áàõðîì Ñóííàòóëëîåâè÷ Òóðãóíîâ»99»»» "
如果我只是在浏览器中显示文件内容:
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
$file_content = file( "test.HI0" );
echo $file_content[2];
我明白这一点:
11/08/2015 00:07:17��� 2 ����������� �������24001066��������� ���������� �������99���
如何以UTF-8编码正确显示或保存文本?
感谢anvance。
UPD。
感谢大家。我发现另一个解决方案看起来很丑陋但工作正常。
$file_content = file( "test.HIO" );
$str = iconv( "ISO-8859-1", "UTF-8", $file_content[2] );
// OR
$str = mb_convert_encoding( $file_content[2], "UTF-8", "ISO-8859-1" );
$str = iconv( 'utf-8', 'windows-1252', $str );
$str = iconv( 'windows-1251', 'utf-8', $str );
var_dump( $str );
UPD 2。
我使用 file -i 选择了错误的方法来检测文件编码 事实证明,我的文件编码是 windows-1251
chardet /home/file.HI0
/home/file.HI0: windows-1251 (confidence: 0.75)
或 @yangsunny 建议 enca
enca -L ru /home/file.HI0
MS-Windows code page 1251
最终,可以使用此代码:
$file_content = file( "test.HIO" );
$str2 = mb_convert_encoding( $file_content[2], "UTF-8", "windows-1251" );
var_dump( $str2 );
感谢大家的帮助。
答案 0 :(得分:2)
您正在以正确的方式进行转换。问题是您不知道源编码。例如,考虑货币转换:您可以将100英镑或100日元兑换成美元。但你不能只转换为“100”。
来自Wikipedia(强调我的):
ISO / IEC 8859-1:1998 [...]通常用于西欧 语言(见下面的列表)。
很明显,西里尔文(俄语,乌克兰语或其他)不能是ISO-8859-1,这是一种只有拉丁字母字符的编码。
正确的文本编码检测是一项手动任务。如果你确定文本是西里尔文,你需要做一些研究,找出哪些编码支持西里尔文,然后找出哪一个更符合你的数据。您可能需要获得实际的hexadecimal values。即便如此,仍然存在错误的余地。例如,99%的字符可能存在相同的编码,但剩余的1%可能不同。