Назначение функции utf8_encode

Предположим, что 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 и сделает мусор.