【问题标题】:PHP convert string from UCS-2LE to UTF-8PHP 将字符串从 UCS-2LE 转换为 UTF-8
【发布时间】:2016-08-14 09:10:11
【问题描述】:

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

虽然我并不完全理解文件的编码。作者说该文件是用 Unicode 编码的,通过在 Notepad++ 中打开它来确认它是 UCS2 LE w/o 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 将其转换为正确的编码?现在是哪种编码?提前致谢!

【问题讨论】:

  • 你可以给我你的谷歌驱动器或其他文件吗?或者用乌龟检查字符集。我觉得他比记事本好
  • 泰。我看到了 UTF-16E LF。我启动本地主机并查看

标签: php unicode encoding utf-8 ucs2


【解决方案1】:

您的测试 $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>

我不知道它是否好(不懂俄语),但这是我的输出:

Полный адрес Language Sprache Langue Lingua Idioma Язык Bahasa Адрес назначения ...

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

【讨论】:

  • 注意:我认为 mac sry 上不存在乌龟
【解决方案2】:

看起来好像编码不是问题,是后来的分裂。我使用str_split 将生成的字符串转换为具有相等长度条目的数组。然而,我还没有意识到,文档说明了以下内容:

str_split() 在处理多字节编码的字符串时会拆分成字节,而不是字符。

使用wc -cwc -m 我发现结果元素的字符数相同,但字节数不同。所以 str_split 在某些时候会在字节之间拆分字符。

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

【讨论】:

  • 我不明白为什么我的回答对你不利。结果不好吗?对于拆分字符串,您不能开发自己的函数来解析字符串并将其剪切到数组上?
  • 我从来没有说过你的答案不好,我的意思是,它与编码无关,而是与随后的分裂有关。但是你不可能知道,因为我没有写我是如何分割文本的,因为我认为这并不重要。
猜你喜欢
  • 2010-10-29
  • 2020-11-30
  • 2011-05-15
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2014-09-14
相关资源
最近更新 更多