Назначение функции utf8_encode - PullRequest
7 голосов
/ 15 июля 2011

Предполагается, что я кодирую мои файлы с помощью 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, вам не нужна эта функция?

Ответы [ 4 ]

11 голосов
/ 15 июля 2011

Если вы читаете ввод вручную для 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". Его не волнует, что именно находится в кавычках, он просто использует его как есть.

3 голосов
/ 15 июля 2011

PHP вообще не заботится о кодировании строк, строки - это двоичные данные в PHP.Таким образом, вы должны знать кодировку данных внутри строки, если вам нужно кодирование.Вопрос в следующем: имеет ли значение кодировка в вашем случае?

Если вы зададите для содержимого строковых переменных что-то похожее на то, что вы сделали:

$string="ぁ";

Это будет , а не содержит UTF-8. Вместо этого он содержит двоичную последовательность, которая не является допустимым символом UTF-8.Вот почему браузер или редактор отображает вопросительный знак или аналогичный.Поэтому, прежде чем продолжить, вы уже видите, что что-то может быть не так, как задумано. (Оказалось, что это был отсутствующий шрифт на моем конце)

Это также показывает, что ваш файл в редакторе поддерживает UTF-8 или какой-то другой вариант кодировки Unicode.Просто помните следующее: один файл - одна кодировка.Если вы храните строку внутри файла, она находится в кодировке этого файла.Проверьте ваш редактор, в какой кодировке вы сохраняете файл.Тогда вы знаете кодировку строки.

Давайте просто предположим, что это какой-то действительный UTF-8, например, так (поддержка моего шрифта):

$string="ä";

Затем вы можете сделать двоичное сравнениепозже строки:

if ( 'ä' === $string )
  # do your stuff

Поскольку он находится в одном и том же файле, а строки PHP являются двоичными данными, это работает с любой кодировкой.Поэтому обычно вам не нужно перекодировать (изменять кодировку) данные, если вы используете функции, которые двоично-безопасны - это означает, что кодировка данных не изменяется.

Для регулярных выражений кодирование играет роль.Вот почему есть модификатор u, который сигнализирует о том, что вы хотите, чтобы выражение работало с данными в кодировке Unicode.Однако, если данные уже закодированы в Unicode, вам не нужно менять их на Unicode, прежде чем использовать preg_match.Однако в вашем примере кода регулярные выражения совсем не нужны, и простое сравнение строк делает работу.

Резюме:

$string="ä";
if ( 'ä' === $string )
  # do your stuff
1 голос
/ 15 июля 2011

Ваша строка не является символом utf-8, поэтому она не может предварительно соответствовать ей, поэтому вам нужно использовать utf8_encode. Попробуйте зашифровать файл PHP как utf-8 (используйте что-то вроде Notepad ++), и он может работать без него.

0 голосов
/ 16 июля 2011

Сводка:

Функция utf8_encode() будет кодировать каждый байт от заданной строки до UTF-8.Независимо от того, какая кодировка использовалась ранее для хранения файла.Его целью является кодирование строк¹, которые еще не являются 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 и сделает мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...