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 關注
- 375 瀏覽
添加回答
舉報