Предположим, что im кодирует мои файлы с помощью UTF-8.
В скрипте PHP будет сравниваться строка:
$string="ぁ"; $string = utf8_encode($string); //Do i need this step? if(preg_match('/ぁ/u',$string)) //Do if match...
Эта строка действительно UTF-8 без функции utf8_encode ()? Если вы кодируете свои файлы с помощью UTF-8, эта функция не нужна?
Если вы прочитали инструкцию для utf8_encode
, она преобразует кодированную строку ISO-8859-1 в UTF-8 . Имя функции – это ужасное неправильное обозначение, так как оно предлагает какую-то автоматическую кодировку, которая необходима. Это не относится к делу. Если ваш исходный код сохраняется как UTF-8 и вы присваиваете «あ» $string
, тогда $string
содержит символ «あ», закодированный в UTF-8. Никаких дальнейших действий не требуется. Фактически, попытка конвертировать строку UTF-8 (некорректно) из ISO-8859-1 в UTF-8 будет искажать ее.
Чтобы уточнить немного, ваш исходный код читается как последовательность байтов. PHP интерпретирует важную для него информацию (все ключевые слова и операторы и т. Д.) В ASCII. UTF-8 обратно совместим с ASCII. Это означает, что все «обычные» символы ASCII представлены с использованием того же байта как в ASCII, так и в UTF-8. Таким образом, "
интерпретируется как "
PHP, независимо от того, будет ли он сохранен в ASCII или UTF-8. Что-либо между кавычками, PHP просто принимает как литерал бит последовательности. Поэтому PHP видит ваш "あ"
как "11100011 10000001 10000010"
. Неважно, что конкретно между кавычками, оно просто будет использовать его как есть.
PHP вообще не заботится о строковой кодировке, строки – это двоичные данные в PHP. Таким образом, вы должны знать кодировку данных внутри строки, если вам нужна кодировка. Вопрос в том, имеет ли смысл кодирование в вашем случае?
Если вы установили содержимое строк переменных на что-то вроде этого:
$string="ぁ";
Он не будет содержать UTF-8. Вместо этого он содержит двоичную последовательность, которая не является допустимым символом UTF-8. Вот почему браузер или редактор отображает вопросительный знак или аналогичный. Поэтому, прежде чем продолжать, вы уже видите, что что-то может быть не таким, как предполагалось. (Оказалось, что это был недостающий шрифт на моем конце)
Это также показывает, что ваш файл в редакторе поддерживает UTF-8 или какой-либо другой способ кодировки в кодировке Юникод. Просто помните следующее: один файл – одна кодировка. Если вы храните строку внутри файла, она находится в кодировке этого файла. Проверьте свой редактор, в какой кодировке вы сохраняете файл. Затем вы знаете кодировку строки.
Предположим, что это действительно допустимый UTF-8 (поддержка моего шрифта):
$string="ä";
Затем вы можете выполнить двоичное сравнение строки позже:
if ( 'ä' === $string ) # do your stuff
Поскольку он находится в одном файле, а строки PHP – двоичные данные, это работает с каждой кодировкой. Поэтому обычно вам не нужно перекодировать (изменять кодировку) данные, если вы используете функции, которые являются бинарными, а это значит, что кодировка данных не изменяется.
Для обычного выражения кодирование действительно играет роль. Вот почему есть модификатор u
, чтобы сигнализировать, что вы хотите заставить выражение работать и с кодированными в Юникоде данными. Однако, если данные уже закодированы в кодировке unicode, вам не нужно менять их в юникод, прежде чем использовать preg_match
. Однако с вашим примером кода регулярные выражения вообще не нужны, и простое сравнение строк выполняет задание.
Резюме:
$string="ä"; if ( 'ä' === $string ) # do your stuff
Ваша строка не является символом utf-8, поэтому она не может соответствовать ей, поэтому вам нужно использовать utf8_encode. Попробуйте кодировать PHP-файл как utf-8 (используйте что-то вроде Notepad ++), и он может работать без него.
Резюме:
Функция utf8_encode()
будет кодировать каждый байт из заданной строки в UTF-8. Независимо от того, какое кодирование использовалось ранее для хранения файла. Целесообразно кодировать строки¹, что arent UTF-8.
1.- Правильное использование этой функции дает в качестве параметра строку ISO-8859-1. Зачем? Поскольку Unicode и ISO-8859-1 имеют одинаковые символы в одинаковых позициях.
[Char][Value/Position] [Encoded Value/Position] [Windows-1252] [€][80] ----> [C2|80] Is this the UTF-8 encoded value/position of the [€]? No [ISO-8859-1] [¢][A2] ----> [C2|A2] Is this the UTF-8 encoded value/position of the [¢]? Yes
Кажется, что функция работает с другими кодировками: она работает, если строка для кодирования содержит только символы с одинаковыми значениями, которые кодируются ISO-8859-1 (например, в Windows-1252 00-EF & A0-FF
).
Мы должны принять во внимание, что если функция получит строку UTF-8 (файл, закодированный как UTF-8), он снова закодирует эту строку UTF-8 и сделает мусор.