Поскольку наш PHP-код работает в разных средах, мы не контролируем (и мы не знаем кодировки), идея состоит в том, чтобы не использовать никаких символов ASCII в исходном коде.
Однако в коде есть несколько мест, где определены строковые литералы, которые не содержат символов ASCII, например "TextWithÜ".
Есть ли способ написать "Ü" только с помощью ASCII?
Самое лучшее, что я могу придумать, это использовать HTML-нотацию и декодировать ее.
html_entity_decode('TextWithÜ');
Однако, поскольку мы не знаем кодировки по умолчанию в системе, я должен был бы также обнаружить это:
html_entity_decode('TextWithÜ', ENT_COMPAT | ENT_HTML401, ini_get('default_charset'));
И html_entity_decode поддерживает только подмножество ini_get('default_charset')
поэтому иногда это может быть неудачно.
Есть ли способ лучше?
Если вы все еще обеспокоены этим, лучшим способом, вероятно, является прямое выражение строк как байты:
$str = "TextWith\xC3\x9C"; // "Ü"
Это будет несколько громоздким как для записи, так и для чтения, но это самый прямой способ системно-агностически создавать строки с контентом в конкретной кодировке.
Предполагая, что вы запускаете свои файлы в виде включенных файлов в другое приложение, и ваша проблема заключается в том, что вы не знаете, какую кодировку ожидает другое приложение, вы бы создали "бутерброд с кодировкой". Ваш код находится посередине и использует одну стандартизованную кодировку (желательно UTF-8), при этом "ребра" преобразуются в и из любого другого окружающего кода. Это означает, что вам нужны определенные границы, определенные функции, с которыми взаимодействует другой код. Во всех входных точках вы делаете что-то вроде:
function take_input($input) {
$input = iconv(App::externalEncoding(), 'UTF-8', $input);
...
}
Во всех точках, возвращающих данные в другой код, вы должны:
function return_output() {
...
return iconv('UTF-8', App::externalEncoding(), $output);
}
С другой точки зрения приложения это выглядело бы так:
require_once 'JochensCode.php';
App::externalEncoding('SJIS');
take_input('文字化け');
echo return_output();