Jan. 13th, 2023

gianthare: (Default)

Короче, я понял, корейский вас интересует больше, чем вечерние купания.
Так вот. Во первых, корейский, хоть и выглядит как кракозябры, на самом деле алфавит. Только, видимо все же под влиянием китайского, буквы группируются в слоги, в смысле буквы/звуки одного слога пишутся один рядом/под другим и вписаны в типа квадрат. Каждый слог состоит примерно из начального согласного, гласного и конечного согласного, примерно, которые пишется один над другим. Один из согласных может отсутствовать, для этого специальное обозначение, по крайней мере для первого. Кстати, корейский алфавит придумал лично какой-то их король в 16-ом веке. До этого они писали более-менее на китайском, как я понимаю. И до сих пор немного (или много, я не смог понять) используют иероглифы.
Что это означает с точки зрения компьютера и программиста? Что нельзя просто показать корейские буквы одна за другой справа налево. А надо их хитро размещать одну рядом/под другой. Причем иногда рядом, иногда под, в зависимости от того, что дальше в слоге.
Простым решением было сделать фонт, в котором каждый слог нарисован уже целиком, и так его и показывать. Коды для этих знаков не случайные, а вполне себе вычислимые: [(initial) × 588 + (medial) × 28 + (final)] + 44032
Последнее 44032 думаю юникодовская добавка.
Вот пример из Википедии:
Чтобы найти код слога "한" in Unicode:
Код начальной согласной (ㅎ) - 18.
Код гласной (ㅏ) - 0.
Код конечной согласной (ㄴ) - 4.
Подставляем в формулу и получаем [(18 × 588) + (0 × 28) + 4] + 44032 = 54620. В Unicode код слога 한 это 54620.
(Я когда-то примерно знал буквы, но забыл, так что я не знаю, какой это слог. Ок, это, оказывается, хан)
Полюбуйтесь, как они нетривиально расположены. Неудивительно, что решили нарисовать весь слог заранее.

Хорошо, а как мы их вводим? А очень просто - по одной букве, ведь это же алфавит. Кстати, для отдельных букв у нас тоже есть символы, хотя реально в корейском тексте отдельные буквы не встречаются. Значит, человек нажимает Х, мы ставим/рисуем Х, дальше человек нажимает А, опа, стираем последнее Х, и пишем вместо этого ХА, человек нажимает Н - стираем ХА и пишем ХАН, т.е. символ Х*588 + А*18 + Н + 44032.
А если он ошибся, хочет исправить и нажал backspace, то стираем символ ХАН, считаем, из каких букв он был составлен, и пишем ХА. Красота.
Казалось бы, в нынешние времена процессору делать в основном нечего и он вполне может сам посчитать и отрендерить ХАН в правильном порядке, так же как он может показать â, закодированный при помощи обычного a, за которым идёт circumflex.
Но нет, ещё 7 лет назад то ли айфон то ли андроид правильно показывал только pre-composed syllables, а отдельные буквы так и показывал по-отдельности.

gianthare: (Default)

Напишу ещё про турецкий и оставлю вас в покое.
Турки с реформы Ататюрка пользуются латиницей. Но пришлось несколько букв добавить, конечно. Например, в турецком есть "и с точкой", т.е. обычное i и "и без точки", которое такое же но без точки. Означает оно примерно "ы". И укаждого есть строчный и заглавный вариант. Заглавное "и с точкой" выглядит как заглавное и, только с точкой, а заглавное "и без точки" выглядит как знакомое нам заглавное и латинское (которое не отличить от строчного эль, но это отдельная история). Все очень логично. Пишем от руки, печатаем на станке, на машинке, все хорошо.
Enter computer. Захотели мы писать на компе на турецком. Имеем право. Возьмём за основу ASCII, т.е. кодировку для английского, и добавим недостающие буквы. В частности, заглавное "и с точкой" и строчное "и без точки". А оба i, т.е. с нашей турецкой точки зрения строчное и с точкой и заглавное и без точки оставим как есть, потому что они уже есть. Не, нуачо, не придумывать же другое i, специально для турецкого, тем более выглядят они одинаково. So far so good.
А теперь захотелось нам взять слово написанное строчными буквами и сделать там все буквы заглавными. Мы это отлично умеем делать. Нам даже не надо нигде хранить как из маленькой буквы сделать большую (и наоборот), потому что мы очень хитрые - у нас все маленькие буквы идут подряд и все большие идут подряд, т.е. между кодом маленькой буквы и большой разница всегда одна и та же. Мы ее даже не обязаны помнить, а можем посчитать, когда надо. Так что с точки зрения программиста
'B' = 'b' + 'A' - 'a'
Офигенно, сэкономили 2*28 байт и вообще молодцы.
А теперь применим эту логику к турецкому слову, где есть i и получим I. Т.е. строчное "и с точкой" превратилось в заглавное "и без точки", попросту говоря Ы, и наоборот.
Пяток лет назад турки жаловались, что в некоторых частях виндоуз это все ещё происходит.
Ну и вообще, в общем случае эту проблему решить невозможно, потому что в юникоде нигде язык не указан, и значит мы никогда не можем быть уверены, что правильно трансформируем слово. Потому что лет 50 назад кто-то что-то сэкономил. А юникод с большим уважением к традициям этот ужас сохранил.

Profile

gianthare: (Default)
gianthare

March 2026

S M T W T F S
1234567
8910111213 14
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 14th, 2026 07:23 pm
Powered by Dreamwidth Studios