В настоящее время я работаю над проектом, в котором мне нужно последовательно (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? И какая сейчас кодировка? Заранее спасибо!
Ваш тест с $ 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 и др.) И делаю файл сравнения. И черепаха покажет кодировку.
Посмотреть на экране :
Похоже, что кодировка не была проблемой, это было разделение впоследствии. я использовал str_split
преобразовать полученную строку в массив с записями равной длины. Я не понял, однако, что в документации отмечается следующее:
str_split () будет разбиваться на байты, а не на символы при работе с многобайтовой кодированной строкой.
С помощью wc -c
а также wc -m
Я понял, что количество символов в полученных элементах было одинаковым, но число байтов не было. Поэтому str_split в некоторых точках разделяет символы между байтами.
Я не нашел ни одной встроенной функции, которая разбивает многобайтовую строку на байты, поэтому я использовал функцию, аналогичную размещено здесь.