Как я могу определить символы Unicode в PHP, используя только ASCII?

0

Поскольку наш 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') поэтому иногда это может быть неудачно.

Есть ли способ лучше?

  • 0
    Мне несколько непонятно, что именно вас беспокоит. Можете ли вы уточнить, что именно вы не контролируете в этих средах и где вы можете увидеть сбои из-за проблем с кодированием?
  • 0
    во-первых, это плохая идея использовать ASCII, лучше использовать UTF-8. извини но имхо
Теги:
utf-8
encoding
html-entities

1 ответ

4
Лучший ответ
  1. Если вы отправляете файлы исходного кода, вы контролируете их кодировку. Если вы сохраните свои файлы в кодировке UTF-8, все строковые литералы внутри этого файла будут кодироваться в кодировке UTF-8. Нужно было бы целенаправленно преобразовать кодировку файла, чтобы изменить это, что вряд ли произойдет случайно или некорректно сконфигурировано.
  2. Если вы все еще обеспокоены этим, лучшим способом, вероятно, является прямое выражение строк как байты:

    $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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню