Что такое код mb_detect_order

Как определить правильную кодировку в PHP? mb_detect_encoding не работает

Мне нужно быть в состоянии обнаружить кодировку строки, но mb_detect_encoding не работает.

Я получаю строку из файла ( file_get_contents ) и я знаю, что файл, который доставлял мне неприятности, был в UTF-16 LE. Однако из документов я понимаю, что обнаружить эту кодировку невозможно (mb_detect_order : «Для UTF-16, UTF-32, UCS2 и UCS4 обнаружение кодирования всегда будет неудачным.»).

Как я могу получить кодирование строки надежным способом в PHP? Любая возможная кодировка?

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

Я попробовал это безуспешно, он говорит мне UTF-8:

mb_detect_order

(PHP 4 >= 4.0.6, PHP 5)

mb_detect_order — Set/Get character encoding detection order

Описание

Sets the automatic character encoding detection order to encoding_list.

Список параметров

encoding_list is an array or comma separated list of character encoding. See supported encodings.

If encoding_list is omitted, it returns the current character encoding detection order as array.

mbstring currently implements the following encoding detection filters. If there is an invalid byte sequence for the following encodings, encoding detection will fail.

For ISO-8859-*, mbstring always detects as ISO-8859-*.

For UTF-16, UTF-32, UCS2 and UCS4, encoding detection will fail always.

Пример #1 Useless detect order example

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #2 mb_detect_order() examples

/* Set detection order by enumerated list */
mb_detect_order ( «eucjp-win,sjis-win,UTF-8» );

/* Set detection order by array */
$ary [] = «ASCII» ;
$ary [] = «JIS» ;
$ary [] = «EUC-JP» ;
mb_detect_order ( $ary );

/* Display current detection order */
echo implode ( «, » , mb_detect_order ());
?>

Смотрите также

  • mb_internal_encoding() — Set/Get internal character encoding
  • mb_http_input() — Detect HTTP input character encoding
  • mb_http_output() — Set/Get HTTP output character encoding
  • mb_send_mail() — Send encoded mail
НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Странное поведение mb_detect_order () в PHP

Я хотел бы определить кодировку некоторого текста (используя PHP). Для этой цели я использую функцию mb_detect_encoding().

Проблема заключается в том, что функция возвращает разные результаты, если я изменяю порядок возможных кодировок с помощью функции mb_detect_order().

Рассмотрим следующий пример

Однако, если вы измените порядок кодировок в mb_detect_order(), результаты будут разными:

Итак, мои вопросы:
Почему это происходит?
Есть ли способ в PHP правильно и недвусмысленно обнаруживать кодировку текста?

4 ответа

Что бы я ожидал.

Алгоритм обнаружения, вероятно, просто пытается, по порядку, указать кодировки, указанные вами в mb_detect_order , а затем возвращает первый, под которым будет действовать байтовый поток.

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

ИЗМЕНИТЬ: см. в этой статье для более интеллектуальных методов.

Благодаря своей важности автоматическое обнаружение набора символов уже реализовано в основных интернет-приложениях, таких как Mozilla или Internet Explorer. Они очень точные и быстрые, но в реализации в каждом конкретном случае применяются многие знания о домене. В отличие от их методов мы стремились к простому алгоритму, который может быть единообразно применен к каждой кодировке, а алгоритм основан на хорошо установленных стандартных машинных методах обучения. Мы также изучали взаимосвязь между распознаванием языка и набора символов и сравнивали алгоритмы на основе байт и алгоритмы на основе символов. Мы использовали Naive Bayes (NB) и поддержку векторной машины (SVM).

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

Например, utf-8 и ISO-8859-1 одинаковы для букв a-z. Строка «hello» будет иметь идентичную последовательность байтов в обоих кодировках.

Именно поэтому в первую очередь есть функция mb_detect_order() , так как она позволяет вам сказать, что вы предпочли бы, когда произойдут эти столкновения. Вы хотите, чтобы «привет» был utf-8 или ISO-8859-1?

Имейте в виду, что mb_detect_encoding() не знает, что такое кодировка данных. Вы можете увидеть строку, но сама функция видит поток байтов. Исходя из этого, нужно угадать, что такое кодирование — например, ASCII будет, если байты находятся только в диапазоне 0-127, UTF-8 будет, если есть ASCII-байты и 128 + байты, которые существуют только парами или более и т.д.

Как вы можете себе представить, учитывая этот контекст, довольно сложно обнаружить кодирование надежно.

Как rihk, это то, для чего предназначена функция mb_detect_order() — вы в основном снабжаете свое лучшее предположение, каковы будут данные. Часто ли работаете с файлами UTF-8? Тогда, скорее всего, ваши вещи вряд ли будут UTF-16, даже если mb_detect_encoding() может угадать это как.

Вы также можете проверить Artefacto ссылку для более -depth view.

Пример примера: Internet Explorer использует некоторые интересные предположения о кодировке, если ничего не указано (@link, Section: «Автоматически определять язык веб-сайта» ), который вызвал странное поведение на сайтах, которые в прошлом воспринимали кодировку как нечто само собой разумеющееся. Наверное, вы можете найти некоторые забавные вещи, если вы google вокруг. Это делает хороший демонстрационный пример, как даже статистические методы могут привести к ужасным ошибкам, и почему кодирование-угадывание в целом проблематично.

mb_detect_encoding просматривает первую запись charset в вашем mb_detect_order(), а затем перебирает ваш символ $html ввода по символу, соответствует ли этот символ допустимому набору символов для кодировки. Если каждый символ совпадает, то он возвращает true; если какой-либо символ выходит из строя, он переходит к следующей кодировке в mb_detect_order() и повторяет попытку.

Список кодировок vikipedia — это хорошее место, чтобы увидеть символы, составляющие каждую кодировку.

Поскольку эти значения кодировки перекрываются (char x8fA1EF существует как в «UTF-8», так и в «EUC-JP» ), это будет считаться совпадением, даже если это абсолютно другой символ в каждом наборе символов. Поэтому, если ни одно из значений символа не существует в одной кодировке, но не в другой, то mb_detect_encoding не может определить, какая из кодировок недействительна; и вернет первую кодировку из списка массивов, которая может быть действительной.

Насколько мне известно, нет четкого способа идентификации кодировки. Метод «наилучшего угадывания» в PHP может помочь, если у вас есть разумное представление о том, какие кодировки вы, вероятно, столкнетесь, и закажите свой список соответственно на основе пробелов (недопустимых символов) в каждой кодировке. Лучшим решением является «знать» кодировку. Если вы очищаете свой html с другой страницы, найдите идентификатор кодировки в заголовке этой страницы.

Если вы действительно хотите быть умным, вы можете попробовать и определить язык, на котором написан html, возможно, используя триграммы или n-граммы или подобные, как описано в в этой статье на PHP/ir.

php — Странное поведение mb_detect_order() в PHP

Я хотел бы определить кодировку некоторого текста (используя PHP). Для этой цели я использую функцию mb_detect_encoding().

Проблема заключается в том, что функция возвращает разные результаты, если я изменяю порядок возможных кодировок с помощью функции mb_detect_order().

Рассмотрим следующий пример

Однако, если вы измените порядок кодировок в mb_detect_order(), результаты будут разными:

Итак, мои вопросы:
Почему это происходит?
Есть ли способ в PHP правильно и недвусмысленно обнаруживать кодировку текста?

    1 4
  • 20 июн 2020 2020-06-20 15:21:52
  • Termos

4 ответа

mb_detect_encoding просматривает первую запись charset в вашем mb_detect_order(), а затем перебирает ваш символ $html ввода по символу, соответствует ли этот символ допустимому набору символов для кодировки. Если каждый символ совпадает, то он возвращает true; если какой-либо символ выходит из строя, он переходит к следующей кодировке в mb_detect_order() и повторяет попытку.

Список кодировок vikipedia — это хорошее место, чтобы увидеть символы, составляющие каждую кодировку.

Поскольку эти значения кодировки перекрываются (char x8fA1EF существует как в «UTF-8», так и в «EUC-JP» ), это будет считаться совпадением, даже если это абсолютно другой символ в каждом наборе символов. Поэтому, если ни одно из значений символа не существует в одной кодировке, но не в другой, то mb_detect_encoding не может определить, какая из кодировок недействительна; и вернет первую кодировку из списка массивов, которая может быть действительной.

Насколько мне известно, нет четкого способа идентификации кодировки. Метод «наилучшего угадывания» в PHP может помочь, если у вас есть разумное представление о том, какие кодировки вы, вероятно, столкнетесь, и закажите свой список соответственно на основе пробелов (недопустимых символов) в каждой кодировке. Лучшим решением является «знать» кодировку. Если вы очищаете свой html с другой страницы, найдите идентификатор кодировки в заголовке этой страницы.

Если вы действительно хотите быть умным, вы можете попробовать и определить язык, на котором написан html, возможно, используя триграммы или n-граммы или подобные, как описано в в этой статье на PHP/ir.

  • 20 июн 2020 2020-06-20 15:21:53
  • Mark Baker

Имейте в виду, что mb_detect_encoding() не знает, что такое кодировка данных. Вы можете увидеть строку, но сама функция видит поток байтов. Исходя из этого, нужно угадать, что такое кодирование — например, ASCII будет, если байты находятся только в диапазоне 0-127, UTF-8 будет, если есть ASCII-байты и 128 + байты, которые существуют только парами или более и т.д.

Как вы можете себе представить, учитывая этот контекст, довольно сложно обнаружить кодирование надежно.

Как rihk, это то, для чего предназначена функция mb_detect_order() — вы в основном снабжаете свое лучшее предположение, каковы будут данные. Часто ли работаете с файлами UTF-8? Тогда, скорее всего, ваши вещи вряд ли будут UTF-16, даже если mb_detect_encoding() может угадать это как.

Вы также можете проверить Artefacto ссылку для более -depth view.

Пример примера: Internet Explorer использует некоторые интересные предположения о кодировке, если ничего не указано (@link, Section: «Автоматически определять язык веб-сайта» ), который вызвал странное поведение на сайтах, которые в прошлом воспринимали кодировку как нечто само собой разумеющееся. Наверное, вы можете найти некоторые забавные вещи, если вы google вокруг. Это делает хороший демонстрационный пример, как даже статистические методы могут привести к ужасным ошибкам, и почему кодирование-угадывание в целом проблематично.

Как определить правильную кодировку в PHP? mb_detect_encoding не работает

Мне нужно определить кодировку строки, но mb_detect_encoding не работает.

Я получаю строку из файла ( file_get_contents ), и я знаю, что файл, который вызывал у меня проблемы, был в UTF-16 LE. Однако из документов я понимаю, что обнаружение этой кодировки невозможно ( mb_detect_order : «Для UTF-16, UTF-32, UCS2 и UCS4 обнаружение кодировки всегда сбой.»).

Как я могу получить кодировку строки надежным способом в PHP? Любая возможная кодировка?

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

Я пробовал это без успеха, он говорит мне UTF-8:

Что такое код mb_detect_order

mb_detect_order — устанавливает/получает порядок определения кодировки символов.

Описание

array mb_detect_order ([mixed encoding-list])

mb_detect_order() устанавливает автоматический порядок определения кодировки символов списком encoding-list . Возвращает TRUE при успехе, FALSE при неудаче.

encoding-list это массив или список с разделением запятыми кодировок символов. («auto» расширяется в «ASCII, JIS, UTF-8, EUC-JP, SJIS»).

Если encoding-list опущен, возвращает текущий порядок определения кодировки как массив.

Примечание: mbstring в настоящее время реализует следующие фильтры определения кодировки. Если для следующих кодировок имеется неправильная последовательность байтов, определение кодировки терпит неудачу.

UTF-8 , UTF-7 , ASCII , EUC-JP , SJIS , eucJP-win , SJIS-win , JIS , ISO-2022-JP

ISO-8859-* mbstring всегда определяет как ISO-8859-* .

Для UTF-16 , UTF-32 , UCS2 и UCS4 определение кодировки всегда терпит неудачу.

mb_detect_encoding РНР ()

December 2020

7k раз

Прежде всего я хотел бы сказать , что я читал другую почту о mb_detect_encoding РНР на странное поведение mb_detect_order () в PHP . Что определенно подтвердить то , что я бы узнать через пробы и ошибки. Однако есть еще несколько вещей , которые confusese меня.

Я строй HTML скребки главным образом на английских сайтах, собирающие данные и сохраняет его в UTF-8 XML. Я столкнулся с проблемой, когда страница самостоятельно декларирует ISO-8859-1, но он содержит символы, уникальные для Windows-1252. в частности, право одинарные кавычки ( ‘) 0x92. Как я понимаю, окна-1252 является надстройкой ISO-8859-1, который заставляет меня думать, зачем используя utf8_encode () вообще? почему бы просто не использовать Iconv ( «Windows-1252», «UTF-8», $ ул) вместо utf8_encode (), так как все, что представлено в ISO-8859-1 бы получить преобразованы, а также символов уникальных для Windows-1252 ( то есть. €, ƒ» ‘„“)

почему это происходит? если первый символ в строке не окна-1252, несмотря на то, остальное есть, это не удастся? Не такое поведение делает его довольно бесполезно? насколько это отличительный изо-8859-1 и Windows-1252

другое дело, что сбивает с толку мне было, скажем, я хочу, чтобы обнаружить кодировку между ASCII, ISO-8859-1, окна-1252, UTF-8. Можно ли обнаружить строки таким образом, что дает мне самый низкий набор рейтинга? (То есть.

не должен мой $ detect_order = массив ( ‘ASCII’, ‘ISO-8859-1’, ‘Windows-1252’, ‘UTF-8’); Я знаю, что это неверно, так как он дал мне следующие результаты

почему мой детектировать порядок ( ‘ASCII’, ‘ISO-8859-1’, ‘Windows-1252’, ‘UTF-8’) неправильно, что я хочу получить?

ближайшее желанное возвращаемое значение я получил,

оба из следующего массива mb_detect_order дал мне вышеуказанные значения

это путает черт из меня!

уф, кто-то может пролить некоторый свет на это? Большое спасибо это оценили!

из ASCII -> UTF-8

Проблема какая-то не понятна. использую следующий код:

Когда название на латинице, все хорошо. На кирилице крякозябры или пустота. Как отобразить нормально киррилицу? на опенсервере все гуд,на хосте проблема.

1 ответ 1

Должно быть что-то типа:

Посмотрите в phpinfo(); какие кодировки установлены на сервере (в разделе iconv).

попробуйте такой формат:

$convertedText = mb_convert_encoding($text, ‘utf-8’, mb_detect_encoding($text));

Попробуйте на проблемную страницу/шаблон, в самый верх, добавить header(‘Content-Type: text/html; charset=utf-8’); и посмотрите, как и что.

И посмотрите, что ваша страница/шаблон были сохранены без BOM.

*Если обнаружится, что было с BOM, то сохраните без BOM и посмотрите без header, что получается, а потом уж, если надо, то поставьте header на сохраненное без BOM.

Что такое предпочтительный характер порядок кодирования для «mb_detect_encoding ()» в PHP?

Что такое предпочтительный порядок кодировки символов, которые передаются в качестве второго аргумента mb_detect_encoding( ) .

Я спрашиваю это потому, что некоторые кодировки символов перекрывают другие, как ASCII возвращается для UTF (в некоторых случаях) и EUC-CN для GB2312, и любой из EUC-CN, EUC-JP, EUC-KR, EUC-TW зависимости от того, появляется в начале последовательность передается функции возвращается для упрощенной китайской совместимой строки EUC-CN.

Вот некоторые, что я собрал, но я хочу, чтобы сделать список как можно более полным.

Пожалуйста, помогите мне исправить заказ и сделать этот список как можно больше.

Edit 1:

Все, что я хочу сделать, используя это, чтобы преобразовать любую строку в utf8.

Изменить 2:

Учитывая ниже предложения, я хочу, чтобы свести к минимуму возможности текста попусту растрачивать при кодировании преобразования, поскольку переработанный текст является единственным моим сайт использует. Таким образом, даже если решение я использую это не идеальный один. Не могли бы вы продемонстрировать самое надежное решение?

Там нет истинного предпочтительного порядка, который дает наиболее точный ответ.

Там всегда будут строки, которые потенциально могут быть обнаружены и действительными в ряде наборов символов. mb_detect_encoding не может определить, что является правильным.

Единственный способ решить эту проблему, заключается в следующем:

  1. У человека, который понимает язык, чтобы выбрать правильную кодировку.
  2. Потенциально анализировать фактический текст в строке, и «угадать», который является наиболее вероятно, будет правильным.

Для номера два я не знал бы, готовый вариант, но я могу себе представить, что-то вроде символьных скоростей-вхождения, байесовских фильтров, нейронных сетей и словарных проверок может быть полезны;)

Что такое код mb_detect_order

(PHP 4 >= 4.0.6, PHP 5)

mb_detect_order — Set/Get character encoding detection order

Description mixed mb_detect_order ( [mixed encoding_list] )

mb_detect_order() sets automatic character encoding detection order to encoding_list . It returns TRUE for success, FALSE for failure.

encoding_list is array or comma separated list of character encoding. («auto» is expanded to «ASCII, JIS, UTF-8, EUC-JP, SJIS»)

If encoding_list is omitted, it returns current character encoding detection order as array.

Замечание: mbstring currently implements following encoding detection filters. If there is an invalid byte sequence for following encoding, encoding detection will fail.

Замечание: UTF-8 , UTF-7 , ASCII , EUC-JP , SJIS , eucJP-win , SJIS-win , JIS , ISO-2022-JP

For ISO-8859-* , mbstring always detects as ISO-8859-* .

For UTF-16 , UTF-32 , UCS2 and UCS4 , encoding detection will fail always.

Пример 1. Useless detect order example

; Always detect as ISO-8859-1 detect_order = ISO-8859-1, UTF-8 ; Always detect as UTF-8, since ASCII/UTF-7 values are ; val >

Пример 2. mb_detect_order() examples

/* Set detection order by enumerated list */
mb_detect_order ( «eucjp-win,sjis-win,UTF-8» );

/* Set detection order by array */
$ary [] = «ASCII» ;
$ary [] = «JIS» ;
$ary [] = «EUC-JP» ;
mb_detect_order ( $ary );

/* Display current detection order */
echo implode ( «, » , mb_detect_order ());
?>

Пред. Начало След.
mb_detect_encoding Уровень выше mb_encode_mimeheader

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Илон Маск рекомендует:  Импорт шрифта
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL