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
notUTF-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()
不符合名称要求。我建议在使用手册之前先阅读手册页。谢谢,但它不会改变结果。请在十六进制编辑器(例如)中打开原始文件,好吗在你的问题中加上第一行的垃圾桶?问题是我在评论中说的编码错误。你的编码格式错了