通过PHP正确地将字符串转换为UTF-8

时间:2016-03-11 11:13:33

标签: php encoding utf-8

我有一个 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 );

感谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

您正在以正确的方式进行转换。问题是您不知道源编码。例如,考虑货币转换:您可以将100英镑或100日元兑换成美元。但你不能只转换为“100”。

来自Wikipedia(强调我的):

  

ISO / IEC 8859-1:1998 [...]通常用于西欧   语言(见下面的列表)。

很明显,西里尔文(俄语,乌克兰语或其他)不能是ISO-8859-1,这是一种只有拉丁字母字符的编码。

正确的文本编码检测是一项手动任务。如果你确定文本是西里尔文,你需要做一些研究,找出哪些编码支持西里尔文,然后找出哪一个更符合你的数据。您可能需要获得实际的hexadecimal values。即便如此,仍然存在错误的余地。例如,99%的字符可能存在相同的编码,但剩余的1%可能不同。