utf-16le 转 UTF-8

我正在使用phponosx terminal打开使用 生成的文件windows。


我确认文件已utf-16le编码


$file --mime myfile.ini


myfile.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_encoding


while ($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也没有击中。


皈依舞
浏览 259回答 3
3回答

MM们

你可以尝试这样做:while ($line = fgets($handle)) {    $line = rtrim($line);    $line = iconv(mb_detect_encoding($line, mb_detect_order(), true), "UTF-8", $line);;     var_dump($line);}

扬帆大鱼

如果流未采用 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));理想情况下,将输出保存到文件中,以便您可以使用文本编辑器或十六进制编辑器检查结果。

绝地无双

最后我使用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
打开App,查看更多内容
随时随地看视频慕课网APP