Кодировка / кодировка, связанная с PHP строками - PullRequest
2 голосов
/ 03 августа 2020

В документации PHP говорится:

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

[... описано несколько особых случаев ...]

В конечном итоге это означает, что написание правильных программ с использованием Unicode зависит от тщательно избегайте функций, которые не будут работать и которые, скорее всего, повредят данные [...]

Источник: https://www.php.net/manual/en/language.types.string.php

Естественно, мой вопрос is: Где находятся эти спецификации, которые позволяют нам идентифицировать кодировку / кодировку, связанную со строковыми аргументами, возвращаемыми значениями, константами, ключами / значениями массива, ... для встроенных функций / методов / данных (например, array_key_exists, DOMDocument::getElementsByTagName, DateTime::format, $_GET[$key], ini_set, PDO::__construct, json_decode, Exception::getMessage() и многие другие)? Как поставщики пакетов composer определяют кодировки, в которых они принимают / предоставляют текстовые данные?

Я примерно работал со следующей эвристией c: (1) никогда не меняйте кодировку чего-либо, (2 ), когда вы вынуждены выбрать кодировку, выберите UTF-8. Это работает годами, но кажется очень неудовлетворительным.

Каждый раз, когда я пытаюсь найти ответ на вопрос, я получаю только результаты поиска, касающиеся кодировки URL, HTML сущностей или объяснения интерпретации строковых литералов (с кодировкой исходного файла).

Ответы [ 2 ]

1 голос
/ 03 августа 2020

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

Например, array_key_exists не нужно знать что-нибудь о символах, чтобы выяснить, существует ли в массиве ключ с теми же байтами, что и данная строка.

Однако mb_strlen, например, явно сообщает вам, сколько символов состоит в строке of, поэтому ему необходимо интерпретировать данную строку в указанной кодировке c, чтобы получить нужное количество символов. mb_strlen('漢字', 'latin1') и mb_strlen('漢字', 'utf-8') дают очень разные результаты. Не существует единого способа реализации функций такого типа с учетом кодирования *, вам нужно будет ознакомиться с их вводом вручную.

* Функции mb_, в частности, обычно используют mb_internal_encoding(), но другие наборы функций не будет.

Функции вроде DateTime::format ищут в строке формата определенные c символы для замены их значениями даты, например, d для дня, m для месяца и т. д. c. Обычно вы можете предположить, что это значения байтов ASCII, которые он ищет, если не указано иное (и я не знаю ничего, что указывает иное). Так что обычно подойдет любая совместимая с ASCII кодировка.

Для получения более подробной информации вы можете быть заинтересованы в Что каждый программист должен знать о кодировках и наборах символов для работы с текстом .

0 голосов
/ 03 августа 2020

Часто это можно найти в официальной документации, например, класс DOMDocument имеет свойство encoding (определяется объявлением XML). Что касается методов, возвращающих строки, я рекомендую прочитать this

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