在php中将UTF-16LE转换为UTF-8

14

我使用 iconv PHP 函数,但是有些字符转换不正确:

...
$s = iconv('UTF-16', 'UTF-8', $s);
...
$s = iconv('UTF-16//IGNORE', 'UTF-8', $s);
...
$s = iconv('UTF-16LE', 'UTF-8', $s);
...
$s = iconv('UTF-16LE//IGNORE', 'UTF-8', $s);
...

我还尝试了mb_convert_encoding函数,但无法解决我的问题。

一个示例文本文件:9px.ir/utf8-16LE.rar


该字符串是一个阿拉伯语句子,大约一半的字符没有转换。 - علیرضا
2个回答

26

iconv支持UTF-16LE编码

您可以使用它将编码从UTF-16LE转换为UTF-8

$result = iconv($in_charset = 'UTF-16LE' , $out_charset = 'UTF-8' , $str);
if (false === $result)
{
    throw new Exception('Input string could not be converted.');
}

请查看iconv文档

我只是想知道UTF-16LE中可用的所有代码点是否在UTF-8中都可用。但我认为这在您的情况下应该适用。


编辑:我无法在自己的电脑上重现问题,但在另一台电脑上,我遇到了以下提示:

注意:iconv() [function.iconv]:错误的字符集,从UTF-16LE转换为UTF-8是不允许的...

看起来并非所有的iconv版本都能将UTF-16LE转换为UTF-8

使用mb_convert_encoding文档可能是一个解决方法,在这种情况下(演示)至少可以这样做。

$result = mb_convert_encoding($str , 'UTF-8' , 'UTF-16LE');

@ali mzm:无法复现,使用上述代码示例该文件对我有效。 - hakre
@ali mzm:看起来并不是所有的iconv版本都支持,也许你正在遇到这个错误?http://codepad.viper-7.com/GQ1TMz - hakre
@ali mzm:我添加了一个mb_convert_encoding示例,它与iconv执行相同的操作。 - hakre
没有,我没有收到错误。我得到了一个字符串,其中一些字符被正确转换,而另一些则没有。 - علیرضا
@ali mzm:你是否使用了//TRANSLIT//IGNORE?如果是,请不要这样做,除非你已经找到了原因。如果我尝试通过iconvmb_convert_encoding来处理你的数据,我无法重现这个问题。请参阅此演示,其中包含您的数据-您是否在输出中也看到了您的问题?http://codepad.viper-7.com/W4ry1v - hakre

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接