Unicode — 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? И какая сейчас кодировка? Заранее спасибо!

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 Lingua Idioma Язык Bahasa Адрес
назначение …

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

введите описание изображения здесь

0

Другие решения

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

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

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

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

0

По вопросам рекламы [email protected]