PHP преобразовать строку из UCS-2LE в UTF-8

В настоящее время я работаю над проектом, в котором мне нужно последовательно (256 байт) прочитать файл, содержащий информацию о языке. Таким образом, смещение строки 0 запускает значение для кода языка 1, смещение 256 запускает значение для кода языка 2, ...

Хотя я не совсем понимаю кодировку файла. Автор говорит, что файл закодирован в Unicode, что подтверждается открытием его в Notepad++, который идентифицирует его как UCS2 LE без спецификации.

Я пытаюсь преобразовать текст перед тем, как разбить его на 255-байтовые фрагменты, вот так:

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

Это производит такие значения, как " Пользователь заблокирован Msgstr "Я знаю, что этот файл русский, так что это выглядит многообещающе. Однако есть значения, которые кажутся неправильными:

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

Преобразование этого с этим кодом приводит к тому же самому результату:

$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 ответа

Решение

Похоже, что кодировка не была проблемой, это было разделение впоследствии. я использовал str_split преобразовать полученную строку в массив с записями равной длины. Я не понял, однако, что в документации отмечается следующее:

str_split () будет разбиваться на байты, а не на символы при работе с многобайтовой кодированной строкой.

С помощью wc -c а также wc -m Я понял, что количество символов в полученных элементах было одинаковым, но число байтов не было. Поэтому str_split в некоторых точках разделяет символы между байтами.

Я не нашел ни одной встроенной функции, которая разбивает многобайтовую строку на байты, поэтому я использовал функцию, аналогичную той, что была опубликована здесь.

Ваш тест с $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 Lingua Idioma Язык Bahasa Адрес назначения ...

РЕДАКТИРОВАТЬ: Для знаю кодировки, я использую только черепаху. Я выбираю 2 файла (ru.txt и др.) И делаю файл сравнения. И черепаха покажет кодировку. Посмотреть на экране:

Другие вопросы по тегам