mb convert encoding не работает

У меня есть некоторые проблемы с функцией PHP mb_detect_encoding. Я не могу преобразовать его в ISO-8859-1. Любая помощь?

Код:

Вывод:

Обновлено, решение:

Я обновил mb_detect_order до массива (‘UTF-8’, ‘ISO-8859-1’), и он сработал.

На самом деле вы не преобразовали свою строку. Скорее, вызов mb_convert_encoding не предполагал, что исходная строка была в UTF-8. Строка перед вызовом была байтовой последовательностью, которая уже могла быть ISO-8859-1 (и будет представлять элементы по-разному). Вы можете видеть, что это имеет место, вместо вызова mb_detect_encoding , используя bin2hex в строке и видя последовательность байтов после вызова преобразования. Вы увидите, что последовательность байтов не изменилась.

Чтобы преобразовать его в работу, вам необходимо указать (в данном случае) исходную кодировку. Использование:

Если вы проверите последовательность байтов после этого, вы увидите, что преобразование выполнено.

Я обновил mb_detect_order до массива (‘UTF-8’, ‘ISO-8859-1’), и он работал

Несколько дней назад я арендовал виртуальный сервер для своих сайтов, и столкнулся с проблемой. Функция для смены кодировки iconv() не работет на новеньком сервере. Но ничего страшного, данной функции есть замена. Вместо iconv() нужно использовать mb_convert_encoding() . Работает данная функция по такому же принципу.

Пример:

$ windows_1251 = mb_convert_encoding($text , «windows-1251» , «UTF-8» ) ;
//Из utf-8 в windows-1251

$ utf_8 = mb_convert_encoding($text , «UTF-8» , «windows-1251» ) ;
//И наоборот из windows-1251 в utf-8

Результат напечатан на моей странице:

Я уже проверил возможную поддерживаемую кодировку (http://php.net/manual/fr/mbstring.supported-encodings.php ) Latin-1 известен как ISO-8859-1. Но ничего не меняется …

это то, что я получаю, когда печатаю $ перед mb_detect_encoding ();
Моя строка верна. Может быть, это может быть конфигурация php.ini, которая ее испортит? Я не могу изменить это …

EDI_DC40 0000000000027262 2 SALESORDER_CREATEFROMDAT201 SALESORDER_CREATEFROMDAT2 330SOL 96A ORDERSTDX4 Л.С. SERVEURDPL SAPP48 Л.С. SERVEURDPL 1 E2SALESORDER_CREATEFROMDAT2 Х E2BPSDHD1000 00000000000272621 YPR 4803 330 0230 20151002 20151002Z300 7134012207 71 20151002 20151002 E2BPSDITM000 00000000000272622 1 L7820100 9 E2BPSDITM000 00000000000272623 2 L7820400 6 E2BPSDITM000 00000000000272624 3 L9188000 5 E2BPPARNR000 00000000000272625 AG0000510001 E2BPPARNR000 00000000000272626 WE0000510001 E2BPPARNR000 00000000000272627 LQ0000030590 E2BPPARNR000 00000000000272628 00000000000272629 ZQ0000990238 E2BPSCHDL000 1 9 E2BPSCHDL000 000000000002726210 2 6 E2BPSCHDL000 000000000002726211 3 5 E2BPSDTEXT000 000000000002726212 FR E2BPPAREX000 000000000002726213 BAPE_VBAK LX2 E2BPPAREX000 000000000002726214 BAPE_VBAKX Х

У меня все еще есть некоторые проблемы, чтобы закодировать мой файл в ISO-8851-1.
Я просто добавил $out = utf8_decode($out); прежде чем сгенерировать мой файл:

Когда я добавляю «Ô» в конце переменной $ out, файл распознается по-латински, и символ «ô» хорошо печатается. Когда я добавляю его в середину моего файла, документ распознается в utf8, а символ «ô» печатается плохо ( )

Решение

Строки не имеют фактической связанной кодировки, они просто байт
массивы. mb_detect_encoding не говорит вам, что кодирование строки
имеет, он просто пытается обнаружить Это. Это означает, что требуется несколько
угадывает (ваш второй аргумент) и говорит вам первый, который действителен.

Если ваша исходная строка — ASCII, то она также действительна как Latin-1, UTF-8 и целый ряд других кодировок по этому вопросу, которые являются надмножествами ASCII. Преобразование этого на самом деле ничего не изменит. mb_detect_encoding предпочтительно обнаруживает его как ASCII, так как это первое действительное совпадение, и это такой же действительный ответ, как и практически все остальное.

Если вам требуется Latin-1, и вы хотите подтвердить что ваша строка действительна в кодировке Latin-1, используйте mb_check_encoding($str, ‘ISO-8859-1’) .

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

Сначала обратите внимание, что строки PHP не имеют какого-либо специального свойства charset. Обнаружение кодирования полностью основано на побайтовом анализе строки.

Ваша строка содержит только символы из схемы ASCII, поэтому независимо от выбранной вами кодировки она всегда совместима с ASCII (а затем определяется как ASCII из-за более высокого приоритета ASCII).

mb_detect_encoding сравнивает строковые байты с каждой кодировкой, указанной в качестве второго аргумента (по умолчанию mb_detect_encoding ) и возвращает первую кодировку, которая содержит все байты / символы, найденные в строке.

Несколько примеров (я сократил вашу строку для удобства чтения):

Теперь давайте вернем заказ.

А теперь давайте попробуем поместить в вашу строку какой-нибудь не-ascii символ. В этой ситуации mb_detect_encoding поймет, что это не строка ASCII, и проверит ее по UTF-8.

Поскольку ваша строка содержит только ASCII-совместимые символы, вы можете безопасно отображать, сохранять и редактировать ее как ASCII, событие, если оно исходит из источника UTF-8.

Оцените статью
SoftLast
Добавить комментарий