PHP将字符串从UCS-2LE转换为UTF-8

时间:2016-04-21 09:11:55

标签: php unicode encoding utf-8 ucs2

我目前正在开发一个项目,我需要按顺序(256字节)读取包含语言信息的文件。所以字符串偏移0开始语言代码1的值,偏移量256开始语言代码2的值,...

我并不完全理解文件的编码。作者说该文件是用Unicode编码的,可以通过在Notepad ++中打开它来确认,它将其标识为UCS2 LE没有BOM。

我正在尝试转换文本,然后将其拆分为255字节长的块,如下所示:

$content = mb_convert_encoding($content, 'UTF-8', 'UCS-2LE');

这会生成“Пользователь заблокирован”之类的值。我知道这个文件是俄文的,所以看起来很有希望。但是仍有一些值显示不正确:

"┐. ð¢ð░Ðüð¥Ðü ÐëðÁð╗ð¥Ðçð©       ð£ð░"

使用此代码转换它会产生相同的结果:

$content = iconv('UTF-16', 'UTF-8', $content);

以下是我从不同来源获得的不同编码:

Author:
    "Unicode"

file -i <FILENAME>
    "<FILENAME>: application/octet-stream; charset=binary"

mb_detect_encoding($content);
    "UTF-8"

Notepad++:
    "UCS-2 LE w/o BOM"

以下是文件的一部分(通过vi提取,为了清晰起见添加了新行):

^_^D>^D;^D=^DK^D9^D ^@0^D4^D@^D5^DA^D ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@L^@a^@n^@g^@u
^@a^@g^@e^@ ^@S^@p^@r^@a^@c^@h^@e^@ ^@L^@a^@n^@g^@u^@e^@ ^@L^@i^@n^@g^@u^@a^@ 
^@I^@d^@i^@o^@m^@a^@ ^@/^D7^DK^D:^D ^@B^@a^@h^@a^@s^@a^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@^P^D4^D@^D5^DA^D ^@=^D0^D7^D=
^D0^DG^D5^D=^D8^DO^D ^@

我应该如何阅读此文件并使用PHP将其转换为正确的编码?现在是哪种编码?提前谢谢!

2 个答案:

答案 0 :(得分:0)

您的测试使用$ content = iconv('UTF-16','UTF-8',$ content);很好,但它不仅是UTF-16而且是UTF-16LE

<?php
    $content = file_get_contents('ru.txt');
    $content = iconv('UTF-16LE', 'UTF-8', $content);
?>
<html>
<head>
    <title>encodage</title>
    <meta charset="UTF-8">
</head>
<body>
    <?php
        echo $content;
    ?>
</body>
</html>

我无法知道它是否好(不能理解俄语),但这是我的输出:

  

Полныйадрес语言Sprache Langue LinguaIdiomaЯзыкBahasaАдрес   назначения...

编辑:为了知道编码,我只使用乌龟。我选择了2个文件(ru.txt和其他),我做了一个比较文件。并且乌龟显示编码。 看看屏幕:

enter image description here

答案 1 :(得分:0)

似乎编码不是问题,之后就是分裂。我使用str_split将结果字符串转换为具有相等长度条目的数组。但是,我没有意识到文档中注明了以下内容:

  在处理多字节编码字符串时,

str_split()将拆分为字节,而不是字符。

使用wc -cwc -m我发现结果元素的字符数相同,但字节数不是。所以str_split在某些点上将字符分割成字节。

我没有找到任何按字节拆分多字节字符串的内置函数,所以我使用的函数类似于posted here

相关问题