Лыцарь пичальнава образа - UTF-16 [entries|archive|friends|userinfo]
silly_sad

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

UTF-16 [Mar. 31st, 2007|10:29 am]
Previous Entry Add to Memories Tell A Friend Next Entry
ну если верить что iconv следует спецификации, то получается сногсшибательный эффект.
обозначим оператор "echo -n $X | iconv -f koi8-r -t utf-16" как UTF16(X)

и заметим что если текст Х имеет длину N байт то текст UTF16(X) имеет длину ни разу не 2N байт, а 2N+2. Оказывается текст UTF16(X) всегда имеет вначале два фиксированных байта. Математики начинают судорожно вспоминать разницу между подпространством и многообразием. Чо-то там про замыкание относительно каких-то операций....
Какое интересное положение в тексте занимают эти байты! Какова роль этих байт? Надо спросить у Витуса, который говорил мне, что Юникод навсегда избавит нас от этих мерзких переключателей кодовых страниц.

Итого:
UTF16(X) + UTF16(Y) != UTF16(X+Y)
кто-то ещё хочет сказать что всё хорошо ?
LinkLeave a comment

Comments:
[User Picture]
From:[info]avryabov@lj
Date:March 31st, 2007 - 01:42 am
(Link)
Нафига пользоваться то utf16 ? есть же utf8, который без таких дурацких проблем.
[User Picture]
From:[info]slobin@lj
Date:March 31st, 2007 - 02:01 am
(Link)
Н-да? А Вы знаете, что, чтобы виндовый вордпад воспринял текст как находящийся в utf-8, он должен начинаться с EF BB BF? Мне бы никогда не пришло в голову закодировать Byte Order Mark в utf-8, однако же нашлись светлые головы. :-(

... В полутенях сиреневых, в закатной дымке алой ...

[User Picture]
From:[info]slobin@lj
Date:March 31st, 2007 - 01:57 am
(Link)
Да в общем не очень страшно, потому что:
UTF16-1(UTF16(X)+UTF16(Y)) == X+Y
Как насрали, так и убрали.

... Световодозвуконепроницаемость! ...
From:[info]silly_sad@lj
Date:March 31st, 2007 - 07:49 am
(Link)
от этого только хуже !
получается что оператор UTF16^-1(.) отображает счётное множество прообразов на один образ ! и получается что он НЕОБРАТИМ !!!
[User Picture]
From:[info]slobin@lj
Date:March 31st, 2007 - 08:01 am
(Link)
Аналогия -- представьте себе цепочки десятичных цифр, которые представляют натуральные числа почти традиционным образом: при преобразовании в новую нотацию перед числом приписывается незначащий ноль, при сложении двух цепочек количество ведущих нулей в слагаемых суммируется. То есть 02+003=0005. Я пока не придумал, какая от этой нотации может быть польза, но она строго ничем не хуже традиционной. Дурацкая только. :-( Ну да, на самом деле это дикий способ записать двухкомпонентный вектор, но можно сделать вид, что мы этого не заметили.

... А травы останавливают время ...

[User Picture]
From:[info]vitus_wagner@lj
Date:March 31st, 2007 - 03:25 am
(Link)
Это не два байта, это один символ - 0xFEFF. Соответственно, закодирован он может быть либо как 0xFF 0xFE (на интелах и подобиях), либо как 0xFE 0xFF (на нормальных процессорах). Для этого его и пишут, чтобы можно было однозначно опознать, каким образом в данной последовательности байт следует преобразовывать байты в шестнадцатибитные значения.

Кроме того, следует заметить что 16 бит для Unicode - мало. Я вот не помню, каким образом в UTF-16 кодируются символы с кодами больше 65535, но какие-то многосимвольные последовательности для этой цели там употребляются. В общем, UTF-16- самый ублюдский из способов кодирования Unicode. Хуже даже, чем UTF-7. Надо пользоваться либо utf-8, либо wchar_t *, (заметим что sizeof(wchar_t) на нормальных системах -4).
From:[info]silly_sad@lj
Date:March 31st, 2007 - 07:50 am
(Link)
так что вы мне там говорили про то что переключатели кодовых страниц это зло и текст должен быть в ЧИСТОМ ВИДЕ ?
[User Picture]
From:[info]slobin@lj
Date:March 31st, 2007 - 08:11 am
(Link)

каким образом в UTF-16 кодируются символы с кодами больше 65535

Да в общем в рамках постановки задачи довольно разумным. Другое дело, что такая задача вообще не должна была возникать. А ещё мне интересно, что будут делать разные системы, встретив символ с кодом больше 65535, закодированный не прямо в utf-8, а в два символа utf-16, каждый из которых отдельно закодирован в utf-8. И ещё мне интересно, когда питон будет по умолчанию поставляться с 32-битным юникодом (выбор между 16 и 32 делается ключиком компиляции, но, насколько я знаю, все дистрибутивы собирают с 16. Боюсь, что 32 просто недостаточно протестирован, и, если перейти на него, вылезут какие-нибудь баги). А самая беда в том, что две реально самых популярных платформы -- win32 и java -- заложились на utf-16.

... Полная победа сил Добра над силами Разума ...