为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信