Почему там дублирующиеся символы в Unicode?

Эйфелева


class
    APPLICATION
inherit
    ARGUMENTS

create
    make

feature -- Initialization

    make is
            -- Run application.
        local
            l_fact: NATURAL_64
        do
            l_fact := factorial(argument(1).to_natural_64)
            print("Result is: " + l_fact.out)
        end

    factorial(n: NATURAL_64): NATURAL_64 is
            --
        require
            positive_n: n >= 0
        do
            if n = 0 then
                Result := 1
            else
                Result := n * factorial(n-1)
            end
        end

end -- class APPLICATION
5
задан Peter Mortensen 17 September 2011 в 13:34
поделиться

5 ответов

Как отмечали другие, ваша главная ошибка здесь заключается в путанице латинских и кириллических шрифтов и некоторых глифов в них (а именно C ( U + 0043 ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА C ) и С. ( U + 0421 КИРИЛИЧЕСКАЯ ЗАГЛАВНАЯ БУКВА ES )). Есть много таких пар символов, которые похожи друг на друга, но являются разными персонажами. Вы найдете много, например, латинского, греческого и кириллического языков. Однако в большинстве случаев они работают только в верхнем или нижнем регистре.

Однако есть на самом деле дубликаты, иногда намеренно. Например, весь латинский алфавит (ASCII) снова представлен дважды в блоке Unicode «Halfwidth and Fullwidth Forms» между U + FF00 и U + FFEF. Но есть и другие подобные примеры, особенно в разделе математического алфавита на уровне 1, где присутствуют еще три или четыре латинских алфавита.

Есть и другие вещи, которые фактически представляют собой тот же символ, но в разных кодовых точках. Например, есть µ ( U + 00B5 МИКРОЗНАК ) и μ ( U + 03BC ГРЕЧЕСКАЯ СТРОЧНАЯ БУКВА MU ). Обычно они связаны с помощью разложения .

Unicode имеет дело с абстрактной концепцией, называемой кодовой точкой . Кодовая точка однозначно определяет персонажа и его сценарий или группу. В нем ничего не говорится о том, как будет отображаться соответствующий глиф в шрифте (который уже может сильно различаться для латиницы). Он также не определяет, как эта кодовая точка представлена ​​в файле или в памяти (т. Е. Как последовательность байтов). Который' sa для одного из форматов преобразования Unicode .

Какова причина иметь похожий вид символа на двух языках с разными кодовыми точками?

Вот основные моменты Unicode:

  • Совместимость со всеми ранее существовавшими кодировками символов. Это должно гарантировать, что существует взаимно однозначное сопоставление для каждого символа, который использовался в кодировке, в прямой эквивалент в виде кодовой точки Unicode.
  • Точно и точно представлять каждый сценарий, который используется в настоящее время, позже расширенный на другие скрипты, которые использовались и должны храниться в компьютерных системах.

Таким образом, есть очень сильный стимул хранить скрипты отдельно и не пытаться отображать символы в соответствии с их внешним видом . В любом случае внешность может быть сложной. Возьмем, например, кириллическую букву «т», которая здесь выглядит как маленькая латинская буква T в верхнем регистре. Однако обычно он отображается курсивом: 'т' выглядит как строчная латинская 'm'. Вы действительно не хотите отображать таких персонажей по внешнему виду.

20
ответ дан 18 December 2019 в 05:15
поделиться

Если вы посмотрите на таблицу кодов U + 0400 - U + 04FF , вы обнаружите, что U + 0421 - это заглавная буква кириллицы «es». Он может выглядеть как латинский C, но это другой логический символ.

9
ответ дан 18 December 2019 в 05:15
поделиться

Буквы выглядят одинаково, но очень разные. U + 0043 - латинская буква C, а U + 0421 - это кириллица С (которая соответствует букве S в латинском алфавите).

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

8
ответ дан 18 December 2019 в 05:15
поделиться

По той же причине, что 0 и O выглядят одинаково (в большинстве шрифтов с одинарным интервалом), но кодируются по-разному - они означают разные вещи.

7
ответ дан 18 December 2019 в 05:15
поделиться

U + 0043 - это латинское представление C , а U + 0421 - кириллица, то есть на самом деле они не совпадают. письмо, даже если оно может выглядеть так же.

2
ответ дан 18 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

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