亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

utf-16le 轉 UTF-8

utf-16le 轉 UTF-8

PHP
皈依舞 2023-08-11 18:02:18
我正在使用phponosx terminal打開使用 生成的文件windows。我確認文件已utf-16le編碼$file --mime myfile.inimyfile.ini: text/plain; charset=utf-16le現在我用這個腳本將其轉換為 UTF-8。while ($line = fgets($handle)) {    $line = rtrim($line);    $line = mb_convert_encoding($line,"UTF-8","UTF-16LE");     var_dump($line);}不知怎的,它顯示了這樣的腐敗string(63) "?爀漀洀?愀琀攀?? ??? ?? ???"我怎樣才能得到正確的編碼???當我不這樣做時use mb_convert_encodingwhile ($line = fgets($handle)) {    $line = rtrim($line);    $line = mb_convert_encoding($line,"UTF-8","UTF-16LE");     var_dump($line);    if (preg_match('/Optimization/',$line)){print "hit";}}var_dump顯示奇怪的結果為什么是 28???string(28) "Optimization=0"并且preg_match也沒有擊中。
查看完整描述

3 回答

?
MM們

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);

}


查看完整回答
反對 回復 2023-08-11
?
揚帆大魚

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));

理想情況下,將輸出保存到文件中,以便您可以使用文本編輯器或十六進制編輯器檢查結果。


查看完整回答
反對 回復 2023-08-11
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

最后我使用UTF-16BEnot 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


查看完整回答
反對 回復 2023-08-11
  • 3 回答
  • 0 關注
  • 375 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號