Мои два цента
Фактическое решение вашего вопроса заключается в том, что вы должны сначала выполнить проверку кодировки, прежде чем работать над изменением чужих входных строк. Многие быстро узнают о «очистке и проверке» входных данных, но медленно осваивают этап определения основной природы (кодировки символов) строк, с которыми они работают на раннем этапе.
Сколько байтов будет использоваться для представления каждого символа? При правильно отформатированном UTF-8 это может быть 1 (символы, с которыми имеет дело trim
), 2, 3 или 4 байта. Проблема возникает, когда в игру вступают устаревшие или искаженные представления UTF-8 - границы байтовых символов могут не совпадать, как ожидалось (говорят непрофессионалы).
В PHP некоторые выступают за то, чтобы все строки соответствовали правильной кодировке UTF-8 (1, 2, 3 или 4 байта на символ), где такие функции, как trim()
, по-прежнему будут работать, потому что граница байт/символ для символов операции будут соответствовать расширенным значениям ASCII / 1 байт, которые trim()
пытается исключить из начала и конца строки (обрезать страницу руководства).
Однако, поскольку компьютерное программирование — это разнообразная область, невозможно иметь универсальный подход, который работал бы во всех сценариях. С учетом сказанного напишите свое приложение таким, каким оно должно быть для правильной работы. Просто делаете базовый веб-сайт, управляемый базой данных, с вводом данных в форму? Да, за мои деньги заставить все быть UTF-8.
Примечание. У вас по-прежнему будут проблемы с интернационализацией, даже если проблема с UTF-8 стабильна. Почему? Многие неанглийские наборы символов существуют в пространстве 2, 3 или 4 байта (кодовые точки и т. д.). Очевидно, что если вы используете компьютер, который должен работать с китайскими, японскими, русскими, арабскими или ивритскими сценариями, вы хотите, чтобы все работало также и с 2, 3 и 4 байтами! Помните, что функция PHP trim
может обрезать символы по умолчанию или заданные пользователем. Это важно, особенно если вам нужен trim
для учета некоторых китайских иероглифов.
Я бы предпочел иметь дело с проблемой того, что кто-то не может получить доступ к моему сайту, чем с проблемой доступа и ответов, которых не должно быть. Если подумать, это соответствует принципам наименьших привилегий (безопасность) и универсального дизайна (доступность).
Резюме
Если входные данные не соответствуют правильной кодировке UTF-8, вы можете генерировать исключение а>. Вы можете попытаться использовать многобайтовые функции PHP, чтобы определить вашу кодировку, или какая-то другая многобайтовая библиотека. Если и когда PHP будет написан с полной поддержкой юникода (Perl, Java...), PHP станет для этого еще лучше. Усилия по юникоду PHP умерли несколько лет назад, поэтому вы вынуждены использовать дополнительные библиотеки для разумной работы с многобайтовыми строками UTF-8. Простое добавление флага /u
к preg_replace()
не дает полной картины.
Обновлять:
При этом я считаю, что следующая многобайтовая обрезка будет полезна для тех, кто пытается извлечь ресурсы REST из компонента пути URL-адреса (естественно, за вычетом строки запроса). Примечание: это было бы полезно после очистки и проверки строки пути.
function mb_path_trim($path)
{
return preg_replace("/^(?:\/)|(?:\/)$/u", "", $path);
}
person
Anthony Rutledge
schedule
14.08.2018
mb_trim
к расширениюmbstring
, и использовать ее вместо моей собственной. - person federico-t   schedule 09.04.2012\s
обнаруживает NBSP только с опцией/u
. PHP очень запутался в совместимости с UTF8... Есть FastGuide о том, что сегодня безопасно, а что нет? Пример:str_replace
иtrim
(на мой взгляд) совместимы с UTF8, поэтому некоторым функциям не нужна функцияmb_*
, другим нужна... А другим, напримерperg_*
, нужны параметры для обнаружения utf8, даже неявного (см. это\s
неявное обнаружение NBSP). - person Peter Krauss   schedule 08.09.2014