Согласно сайту PHP он делает это:
кодирование – это имя кодировки символов, используемое для преобразования кодировки входного символа HTTP, преобразования кодировки выходного символа HTTP и кодировки по умолчанию для строковых функций, определенных модулем mbstring. Вы должны заметить, что внутренняя кодировка полностью отличается от внутренней для многобайтового регулярного выражения.
- Отправленные письма с phpmailer не отправляются в папку «Отправленные» IMAP
- Kohana 3 получает текущий контроллер / действие / аргументы
- Доступ к переменной, определенной в родительской функции
- API Google Contacts отвечает с ошибкой «countryBlock»
- Использование real_escape_string MySQLi в качестве статической функции
Может кто-нибудь объяснить это проще?
Я предполагаю, что
Если точка 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
будет внезапно вести себя по-другому.