Что факторы делают PHP несовместимый с Unicode?

Я верю, что вы ищете что-то вроде этого:

SELECT *
FROM (
    SELECT
        reg.id,
        reg.collection_id,
        cr.number,
        COUNT(*) AS ct
    FROM tbl_registers AS reg
    INNER JOIN tbl_cross AS cr
        ON cr.register_id = reg.id
    GROUP BY
        reg.id,
        reg.collection_id,
        cr.number
) duplicates
WHERE duplicates.ct > 1
-- AND duplicates.collection_id = 56
42
задан Leigh 11 December 2012 в 12:50
поделиться

6 ответов

Когда PHP был запущен несколько лет назад, UTF-8 действительно не поддерживался. Мы говорим о времени, когда не-Unicode, ОС как Windows 98 / Меня была все еще текущей и когда другие большие языки как Delphi были также не-Unicode. Не все языки были разработаны с Unicode в памяти со дня 1, и полностью изменение Вашего языка к Unicode, не повреждая много материала трудно. Delphi только стал Unicode, совместимым год или два назад, например, в то время как другие языки как Java или C# были разработаны в Unicode со Дня 1.

Поэтому, когда PHP вырос и стал PHP 3, PHP 4 и теперь PHP 5, просто никто не решил добавить Unicode. Почему? По-видимому, для хранения совместимым с существующими сценариями или потому что utf8_de/encode и mb_string уже существовали и работа. Я не знаю наверняка, но я сильно полагаю, что это имеет некоторое отношение к органическому росту. Функции просто не существуют по умолчанию, они должны быть записаны кем-то, и этого просто еще не произошло для PHP.

Редактирование: хорошо, я считал вопрос неправильно. Вопрос: Как строки хранятся внутренне? Если я ввожу в "WГ¤hrung" или "Г‰criture", какое Кодирование используется для создания используемых байтов? В случае PHP это - ASCII с Кодовой страницей. Это означает: Если я закодирую строку с помощью ISO-8859-15, и Вы декодируете его с некоторой китайской кодовой страницей, то Вы станете странными результаты. Альтернатива находится на языках как C# или Java, где все хранится как Unicode, что означает: больше нет никакой кодовой страницы, и теоретически Вы не можете испортить. Я рекомендую статья Joel о Unicode и Наборах символов, но по существу это сводится к: Как строки хранятся внутренне, и ответ с PHP "Не в Unicode", который означает, что необходимо быть очень осторожными и явными, чтобы обработка строк удостоверилась, что всегда сохранила строку в надлежащем кодировании во время входа, устройство хранения данных (база данных) и произвела, который очень подвержен ошибкам.

45
ответ дан Leigh 26 November 2019 в 23:29
поделиться

Понятие "многобайтового символа" в ядре проблемы.

  1. Это пропускает деталь реализации: необходимо быть в состоянии работать с абстракцией символа, не зная, как реализаторы принимают решение представить данные - возможно, в зависимости от платформы, это удовлетворяет им для представления всего как UTF16 или UTF32, в этом случае все является многобайтовым, не, о котором должны заботиться пользователи символьной абстракции.
  2. Это - клудж: Вдобавок к устаревшей привычке к мысли, где все мы "действительно знаем", что строки являются последовательностями байта, мы теперь должны знать, что иногда глыба байтов вместе в вещи, известные как символы Unicode, и, имеет особые случаи повсеместно для контакта с нею.
  3. Это похоже на мышь, пытающуюся съесть слона. Путем структурирования Unicode как расширения ASCII (у нас есть нормальные строки и у нас есть mb_strings), это получает вещи неправильный путь вокруг и становится одержимым тем, какие особые случаи требуются, чтобы иметь дело с символами с забавными загогулинами та потребность больше чем один байт. При обработке Unicode как обеспечения абстрактного пространства для какого-либо символа, Вам нужно, ASCII размещен в этом без любой потребности рассматривать его как особый случай.
11
ответ дан 26 November 2019 в 23:29
поделиться

Вы говорите это сами: для корректного контакта со строками, которые содержат многобайтовые символы, необходимо использовать расширение. Забудьте где угодно использовать дополнительные функции вместо более знакомых "нормальных", и Ваши данные искалечены. То же происходит, если Вы пользуетесь сторонней библиотекой, которая не была обновлена для использования дополнительной функции везде.

кроме того, много чрезвычайно популярная кодировка все еще явно не поддерживается PHP, по-видимому, потому что невозможно сделать так и остаться вниз совместимым.

5
ответ дан postfuturist 26 November 2019 в 23:29
поделиться

Многие общие расширения не имеют поддержки unicode или (еще хуже), "необходимо знать", что строка содержит unicode/utf-8 последовательности, как, например, XMLReader. И это может иметь настоящее значение, называет ли шарик PHP () FindFirstFileA или FindFirstFileW на win32.
Другой (намного меньший, но удивительно часто бывший источником раздражения) проблемой являются BOM, которые не распознают PHP.

3
ответ дан VolkerK 26 November 2019 в 23:29
поделиться

Многие строковые функции являются просто тонкими обертками вокруг эквивалентов библиотеки C, которые также рассматривают все как последовательность байтов. Другая причина состоит в том, что PHP несет вокруг большого количества бесполезного багажа прежней совместимости и таким образом застревает с плохими проектными решениями от 3& 4.

, Возможно, с 5.3's пространства имен у них наконец будет способ постепенно сократить старые функции.

3
ответ дан 26 November 2019 в 23:29
поделиться

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

2
ответ дан muratgu 26 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: