У меня есть некоторые проблемы с функцией 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.