Intereting Posts

Что на самом деле делает mb_internal_encoding PHP?

Согласно сайту PHP он делает это:

кодирование – это имя кодировки символов, используемое для преобразования кодировки входного символа HTTP, преобразования кодировки выходного символа HTTP и кодировки по умолчанию для строковых функций, определенных модулем mbstring. Вы должны заметить, что внутренняя кодировка полностью отличается от внутренней для многобайтового регулярного выражения.

Может кто-нибудь объяснить это проще?

  1. Преобразование кодировки входного символа HTTP
  2. Преобразование кодировки выходного символа HTTP
  3. кодировка символов по умолчанию для строковых функций
  4. Что подразумевается под «внутренним кодированием» полностью отличается от внутреннего для многобайтового регулярного выражения?

Я предполагаю, что

  1. означает, что GET и POST обрабатываются как эта кодировка.
  2. означает, что он выводит на эту кодировку.
  3. означает, что он использует эту кодировку для всех многобайтовых строковых функций.
  4. Я понятия не имею. Почему регулярное выражение будет отличаться от обычных строковых функций?

Если точка 2 правильная, вам нужно будет:

ini_set('default_charset', 'UTF-8'); 

Если я правильно понимаю 3, это означает, что если вы это сделаете:

 mb_internal_encoding('UTF-8') 

Вам не нужно делать:

 mb_strtolower($str, 'UTF-8'); 

Просто:

 mb_strtolower($str); 

Я прочитал еще одну публикацию о том, что mb_strtolower ($ str) не следует доверять и что вам нужно установить кодировку для каждой многобайтовой строковой функции. Это правда?

Расширение mbstring добавило славную идею ( </sarcasm> ) для автоматического преобразования всех входящих данных и всех выходных данных из некоторой кодировки в другую. См. Входы и выходы HTTP mbstring . Он настроен с настройкой mbstring.http_input ini и с помощью mb_output_handler . mb_internal_encoding влияет на это преобразование. ИМО, вы должны оставить эти настройки и не трогать их; Мне еще предстоит найти любую проблему, которая может быть элегантно решена этим, и это звучит как ужасная идея в целом, чтобы иметь неявные преобразования кодирования. Особенно, если все это контролируется с помощью одного глобального флага ( mb_internal_encoding ), который используется в различных контекстах.
Итак, это 1 и 2.

Для 3. да, действительно, mb_internal_encoding основном устанавливает значение по умолчанию для всех функций mb_ которые принимают параметр $encoding . По сути, он просто устанавливает глобальную переменную (внутренне), из которой читаются другие функции, вот и все.

Последняя часть относится к тому факту, что существует отдельная функция mb_regex_encoding для установки внутренней кодировки для функций mb_ereg_ .

Я прочитал еще одну публикацию о том, что mb_strtolower($str) не следует доверять и что вам нужно установить кодировку для каждой многобайтовой строковой функции. Это правда?

Я бы согласился на это, поскольку всему глобальному государству нельзя доверять. Это вполне заслуживает доверия:

 mb_internal_encoding('UTF-8'); mb_strtolower($string); 

Однако это не так:

 mb_strtolower($string); 

Увидеть разницу? Если вы полагаетесь на то, что глобальное состояние установлено правильно в другом месте, вы никогда не можете быть уверены, что оно действительно правильно. Вам просто нужно позвонить в какую-то стороннюю библиотеку, которая устанавливает mb_internal_encoding на что-то другое, без вашего ведома, и ваш вызов mb_strtolower будет внезапно вести себя по-другому.