3 回答
TA贡献1886条经验 获得超2个赞
你可以尝试这样做:
while ($line = fgets($handle)) {
$line = rtrim($line);
$line = iconv(mb_detect_encoding($line, mb_detect_order(), true), "UTF-8", $line);;
var_dump($line);
}
TA贡献1799条经验 获得超9个赞
如果流未采用 ASCII 兼容的编码进行编码,则fgets()不可能可靠地检测行结束符。类似地,当rtrim()查找例如\n
( 'LINE FEED (LF)' (U+000A) ) 时,它需要一个文字0x0A
,但在 UTF-16LE 中编码是0x0A00
。不好的事情可能会发生。
我建议您以 4 字节倍数的块读取文件,这样您就不会分割单个字符,并且在成功重新编码文件之前忘记行结尾:
$output = '';
while ($line = fgets($handle, 4 * 4096)) {
$output .= mb_convert_encoding($line, "UTF-8", "UTF-16LE");
}
var_dump(bin2hex($output));
理想情况下,将输出保存到文件中,以便您可以使用文本编辑器或十六进制编辑器检查结果。
TA贡献1946条经验 获得超4个赞
最后我使用UTF-16BE
not UTF-16LE
,它显示了正确的字符串。
我的问题解决了。
$line = mb_convert_encoding($line,"UTF-8","UTF-16BE");
但我不知道为什么它会起作用,
连file
表扬都说This file is utf-16le
$file --mime myfile.ini myfile.ini: text/plain; charset=utf-16le
- 3 回答
- 0 关注
- 258 浏览
添加回答
举报