Php utf-16le至utf-8

Php utf-16le至utf-8,php,macos,file,encoding,Php,Macos,File,Encoding,我正在使用osx终端上的php打开用windows生成的文件 我确认文件已utf-16le编码 $file--mime myfile.ini myfile.ini:text/plain;字符集=utf-16le $file --mime myfile.ini myfile.ini: text/plain; charset=utf-16le 现在我用这个脚本将其转换为UTF-8 while ($line = fgets($handle)) { $line = rtrim($line);

我正在使用
osx终端上的
php
打开用
windows
生成的文件

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

$file--mime myfile.ini

myfile.ini:text/plain;字符集=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);
}
不知怎的,它显示了这样的腐败

字符串(63)”䘀爀漀洀䐀愀琀攀㴀㈀ ㄀㄀⸀ ㄀⸀ ㄀ഀ਀"

我怎样才能得到正确的编码


当我不
使用mb\u convert\u编码时

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\u match
也不会命中。

如果流未采用ASCII兼容编码,则不可能可靠地检测行尾。类似地,当查找例如
\n
()时,它需要一个文本
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));

理想情况下,将输出保存到文件中,以便您可以使用文本编辑器或十六进制编辑器检查结果。

您可以尝试执行以下操作:

while ($line = fgets($handle)) {
    $line = rtrim($line);
    $line = iconv(mb_detect_encoding($line, mb_detect_order(), true), "UTF-8", $line);; 
    var_dump($line);
}

最后我使用了
UTF-16BE
not
UTF-16LE
,它显示了正确的字符串

我的问题解决了

 $line = mb_convert_encoding($line,"UTF-8","UTF-16BE"); 
但是我不知道为什么它会起作用

甚至
文件
也说
这个文件是utf-16le

$file --mime myfile.ini

myfile.ini: text/plain; charset=utf-16le

我不完全确定这一点,但在试图找出
utf-16le
是否区分大小写时,它可以。您可以尝试使用大写形式吗?utf-16le-这是一个很长的问题。谢谢,我尝试过。但它仍然是一样的。请注意
rtrim()
不支持Unicode,它可能随时损坏您的数据。另外,
var\u dump()
本身不会在此处显示太多信息。您如何知道它不起作用?可能您对编码类型有错误,请使用
mb\u detect\u encoding($line,'utf-16le',true);
查看它返回的内容
mb\u detect\u encoding()
不符合名称要求。我建议在使用手册之前先阅读手册页。谢谢,但它不会改变结果。请在十六进制编辑器(例如)中打开原始文件,好吗在你的问题中加上第一行的垃圾桶?问题是我在评论中说的编码错误。你的编码格式错了