Функции PHP iconv (), mb_convert_encoding () не могут конвертировать KOI8-R в CP1251 - PullRequest
1 голос
/ 11 октября 2019

После экспорта данных из базы данных Cronos в TXT-файл с помощью приложения Windows у меня возникла проблема - экспортированные данные невозможно правильно просмотреть на Linux-сервере (просмотр в Windows в порядке).

Вот пример:

цНПНД|||пЮИНМ|||сКХЖЮ

Я пытался преобразовать его с помощью PHP, потому что позже мне нужно будет преобразовать его в огромный SQL-файл.

Службы декодирования кодировки показали мне, что этот текст следует преобразовать в CP1251 из KOI8-R, поэтому я попробовал его с помощью iconv () и mb_convert_encoding ()

Итак, давайте попробуем это:

$string = iconv('KOI8-R', 'CP1251', $string);

Результат: Notice: iconv(): Detected an illegal character in input string

Я гуглил // IGNORE и повторил попытку: $string = iconv('KOI8-R', 'CP1251//IGNORE', $string);

Результат: та же строка- цНПНД|||пЮИНМ|||сКХЖЮ

Тогда это было mb_convert_encoding без аргумента "from-encoding": $ string = mb_convert_encoding ($ string, 'CP1251');

Результат: ?????|||?????|||?????

... и с "from encoding": цНПНД|||пЮИНМ|||сКХЖЮ

Тогда это были попытки зеркалирования (cp1251 до koi8-r). С помощью iconv () я получил «Обнаружен недопустимый символ во входной строке»;mb_convert_encoding дал мне что-то новое: зПТПД|||тБКПО|||хМЙГБ Попытка конвертировать это в UTF-8 показала много разных символов.

Я также хотел конвертировать этот файл с помощью Notepad ++, но он не позволяет мне открыть 2.5GB txt-file: (

Я также пытался использовать iconv в качестве двоичного файла - те же ошибки.

Все, что мне нужно, - это преобразовать это в читаемые русские символы. Лучший способ - этопреобразовать его в UTF-8, но я не знаю, как это сделать

Linux node03 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux iconv (Ubuntu GLIBC 2.23-0ubuntu11) 2.23

Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0ubuntu0.16.04.2, Copyright (c) 1999-2017, by Zend Technologies```

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Исходная кодировка не была KOI8-R. Это был CP1251

Я конвертировал файл с помощью iconv из CP1251 в UTF-8, это помогло.

0 голосов
/ 14 октября 2019

Использовать CP1252 с кириллическими буквами не очень хорошая идея. Используйте UTF-8.

PHP также может обрабатывать строки с символами! = UTF-8 внутри. Попытка вывести эти строки на страницу с заголовком UTF-8 приведет к неправильному выводу. Шестнадцатеричная запись - это возможность показывать такие строки на страницах UTF-8 или писать в редакторе под UTF-8. Функция strToHex2 () предоставляет такую ​​строку.

//Returns a string with escaped chars in hexadecimal notation
function strToHex2($str) {
   return '\x'.rtrim (chunk_split(strtoupper(bin2hex($str)), 2,'\x'),'\x'); 
}

Следующие строки показывают, что Iconv выполняет преобразование из KOI8-R в UTF8 (и наоборот):

$cityUTF8 = "Город|||";

//convert to KOI8-R
$cityKOI8 = iconv('UTF-8','KOI8-R',$cityUTF8);
echo "KOI8: ".strToHex2($cityKOI8)."<br>";
//KOI8: \xE7\xCF\xD2\xCF\xC4\x7C\x7C\x7C
//compare with https://en.wikipedia.org/wiki/KOI8-R

//convert back to UTF-8 from KOI8 for a check
$cityUTF8Back = iconv('KOI8-R','UTF-8',$cityKOI8); 

//check if equal
var_dump($cityUTF8 === $cityUTF8Back);  //bool(true)
...