?

Log in

No account? Create an account

Previous Entry | Next Entry

... с многобайтовыми кодировками, тот пусть попытается представить букву «д́» (с диакритикой) одним Unicode код-поинтом.

Я уже замучался говорить народу, что ничего нет лучше UTF-8. Для представления человекочитаемого символа что в UTF-16, что в UCS-4 ("UTF-32"), что в UTF-8 может потребоваться несколько комбинаций байт (8 и больше байт в UCS-4!). Это родовая болезнь Unicode, которая делает использование UTF-8 гораздо более правильным и привлекательным, чем все остальные кодировки.

Никогда с юникодом не будет $str[n]="A" правильно работать (заменять произвольный символ на «A») за гарантированную (не amortized) константу времени. Но все пытаются эти грабли непременно пошевелить.

Tags:

Comments

( 137 comments — Leave a comment )
Page 1 of 2
<<[1] [2] >>
sorhed
Feb. 15th, 2012 06:27 pm (UTC)
Я прошу прощения, а что, кто-то этого не понимает? Мне казалось, за последние 5 лет весь мир принял UTF-8.
lionet
Feb. 15th, 2012 06:29 pm (UTC)
Недавно PHP 6 отменили из-за юникода, UTF-8 vs. UTF-16 и поимевания граблей с ними.

http://habrahabr.ru/blogs/php/138269/#comment_4612604

Так что продолжают есть кактус, и очень даже в мейнстриме.
(no subject) - sorhed - Feb. 15th, 2012 06:33 pm (UTC) - Expand
(no subject) - squadette - Feb. 15th, 2012 06:38 pm (UTC) - Expand
(no subject) - justy_tylor - Feb. 15th, 2012 06:40 pm (UTC) - Expand
(no subject) - sorhed - Feb. 15th, 2012 06:41 pm (UTC) - Expand
(no subject) - demmonoid - Feb. 15th, 2012 06:56 pm (UTC) - Expand
(no subject) - sorhed - Feb. 15th, 2012 06:58 pm (UTC) - Expand
(no subject) - demmonoid - Feb. 15th, 2012 07:01 pm (UTC) - Expand
(no subject) - sorhed - Feb. 15th, 2012 07:03 pm (UTC) - Expand
(no subject) - netch - Feb. 16th, 2012 07:00 am (UTC) - Expand
(no subject) - _adept_ - Feb. 15th, 2012 08:32 pm (UTC) - Expand
(no subject) - ex_juan_gan - Feb. 15th, 2012 08:39 pm (UTC) - Expand
(no subject) - sorhed - Feb. 15th, 2012 09:18 pm (UTC) - Expand
(no subject) - avnik - Feb. 15th, 2012 07:58 pm (UTC) - Expand
(no subject) - justy_tylor - Feb. 15th, 2012 08:44 pm (UTC) - Expand
(no subject) - _navi_ - Feb. 17th, 2012 08:10 am (UTC) - Expand
(no subject) - netch - Feb. 16th, 2012 07:02 am (UTC) - Expand
(no subject) - justy_tylor - Feb. 16th, 2012 08:14 am (UTC) - Expand
(no subject) - netch - Feb. 16th, 2012 09:32 am (UTC) - Expand
(no subject) - tzirechnoy - Feb. 16th, 2012 07:36 am (UTC) - Expand
(no subject) - si14 - Feb. 16th, 2012 06:11 pm (UTC) - Expand
itman
Feb. 15th, 2012 06:30 pm (UTC)
Никогда с юникодом не будет $str[n]="A" правильно работать (заменять произвольный символ на «A») за гарантированную (не amortized) константу времени. Но все пытаются эти грабли непременно пошевелить.

Это верно только для строки, реализованной через масив. Для строки реализованной, как список массивов время будет константное.

Ну, и опять-таки, эти все ужасы от того, что кто-то использует альтернативные представления символов. Вроде как для большинства распространенных символов есть однокодовое представление.
lionet
Feb. 15th, 2012 06:39 pm (UTC)
> Это верно только для строки, реализованной через масив. Для строки реализованной, как список массивов время будет константное.

Покажи, плиз, как в строке, реализованной через список массивов, достичь нужного символа и заменить его за гарантированный O(1), а не за O(logN)?

> Ну, и опять-таки, эти все ужасы от того, что кто-то использует альтернативные представления символов. Вроде как для большинства распространенных символов есть однокодовое представление.

Для большинства — есть. А вот мне нужно делать букварь деткам, и обозначать ударения. Например, в слове «у́тка». Скажи, как это сделать с однокодовым представлением символов?

Edited at 2012-02-15 06:40 pm (UTC)
(no subject) - itman - Feb. 15th, 2012 06:44 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 06:47 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 06:49 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 06:53 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 06:57 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 07:12 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 07:21 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 07:27 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 07:30 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 07:37 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 07:40 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 09:22 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 09:30 pm (UTC) - Expand
(no subject) - itman - Feb. 15th, 2012 10:25 pm (UTC) - Expand
(no subject) - _navi_ - Feb. 17th, 2012 08:17 am (UTC) - Expand
(no subject) - itman - Feb. 17th, 2012 02:41 pm (UTC) - Expand
(no subject) - _navi_ - Feb. 17th, 2012 06:36 pm (UTC) - Expand
(no subject) - itman - Feb. 17th, 2012 07:26 pm (UTC) - Expand
(no subject) - _navi_ - Feb. 17th, 2012 07:50 pm (UTC) - Expand
(no subject) - avnik - Feb. 16th, 2012 10:02 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 04:21 pm (UTC) - Expand
(no subject) - dma_k - Apr. 8th, 2012 10:22 pm (UTC) - Expand
(no subject) - lionet - Apr. 9th, 2012 03:39 am (UTC) - Expand
(no subject) - dma_k - Apr. 10th, 2012 03:19 pm (UTC) - Expand
djuffin
Feb. 15th, 2012 07:48 pm (UTC)
Но с размером "нового" char таки надо определиться. Какая максимальная длина последовательности в UTF-8?
lionet
Feb. 15th, 2012 07:51 pm (UTC)
Четыре байта, по самому новому RFC. (Это без учёта combining characters, разумеется).
(no subject) - djuffin - Feb. 15th, 2012 08:00 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 08:04 pm (UTC) - Expand
(no subject) - djuffin - Feb. 15th, 2012 08:07 pm (UTC) - Expand
(no subject) - wizzard0 - Feb. 15th, 2012 08:06 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 08:07 pm (UTC) - Expand
(no subject) - evtuhovich - Feb. 15th, 2012 08:15 pm (UTC) - Expand
(no subject) - wizzard0 - Feb. 15th, 2012 08:20 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 08:29 pm (UTC) - Expand
(no subject) - evtuhovich - Feb. 15th, 2012 08:49 pm (UTC) - Expand
(no subject) - wizzard0 - Feb. 15th, 2012 08:22 pm (UTC) - Expand
_winnie
Feb. 15th, 2012 08:12 pm (UTC)

Ну, проблемы решались по мере их поступления и по мере нарастания их остроты.
Сначала придумали ascii, затем кодо-страницы что бы показывать не только американские/программисткие буквы, затем когда не хватило 256 кодопойнтов - стали массово использовать 65536.

Разве есть желание от пользователей на что-то большее чем 65536 кодопойнтов для общения в фейсбуке?

Я только про han unification знаю, что бы разделить китайский от японского. Есть ещё что-нибудь что нужно пользователям?

ИМХО, всякие хитрые combining characters нужны не для общения в интернете и не для хранения дискурсов в едином хранилище, а для типографике.
Но типографике линейного массива символов всё равно не хватает, ей подавай Тьюринг-полные PostScript и LaTeX в качестве представления документа. Ей такое нужно, а не возможность поставить сраный умляут над буквой Б:




lionet
Feb. 15th, 2012 08:23 pm (UTC)
> ИМХО, всякие хитрые combining characters нужны не для общения в интернете и не для хранения дискурсов в едином хранилище, а для типографике.

В некоторых языках диакритика — не просто ударения (как в слове у́тка), а вполне себе значимая семантическая единица. Или у тебя романо-германский шовинизм, что только европейцы могут нормально общаться в интернете, не коверкая слова?

Вон целая болгария десятилетиями была вынуждена на латинице писать, потому что нормальной поддержки болгарского не было — как со стороны шрифтов, так и со стороны клавиатур. То, что ты говоришь про ненужность диакритики создаёт такие же препятствия, похожие на болгарские, миллионам людей других народностей.
(no subject) - _winnie - Feb. 15th, 2012 08:46 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 08:50 pm (UTC) - Expand
(no subject) - zhengxi - Feb. 16th, 2012 12:26 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 05:57 am (UTC) - Expand
(no subject) - zhengxi - Feb. 16th, 2012 06:08 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 07:38 am (UTC) - Expand
(no subject) - tonsky - Feb. 16th, 2012 08:18 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 08:24 am (UTC) - Expand
(no subject) - zhengxi - Feb. 16th, 2012 10:50 pm (UTC) - Expand
(no subject) - lionet - Feb. 17th, 2012 02:03 am (UTC) - Expand
(no subject) - dma_k - Apr. 10th, 2012 03:38 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 16th, 2012 06:52 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 07:51 am (UTC) - Expand
(no subject) - Anatoly Borodin - Feb. 19th, 2012 12:18 am (UTC) - Expand
(no subject) - lionet - Feb. 19th, 2012 12:36 am (UTC) - Expand
(no subject) - _slw - Feb. 22nd, 2012 03:16 pm (UTC) - Expand
(no subject) - netch - Feb. 16th, 2012 09:22 pm (UTC) - Expand
(no subject) - _slw - Feb. 22nd, 2012 03:19 pm (UTC) - Expand
(no subject) - netch - Nov. 18th, 2012 07:50 am (UTC) - Expand
(no subject) - max630 - Feb. 15th, 2012 09:20 pm (UTC) - Expand
(no subject) - swizard - Feb. 19th, 2012 02:42 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 15th, 2012 08:27 pm (UTC) - Expand
(no subject) - _winnie - Feb. 16th, 2012 09:26 am (UTC) - Expand
(no subject) - tzirechnoy - Feb. 16th, 2012 07:43 am (UTC) - Expand
sheremetyev
Feb. 15th, 2012 08:20 pm (UTC)
Для хранения, конечно, нужно использовать UTF-8, но для обработки строк UTF-32 может быть удобнее? Всё-таки одной степенью свободы меньше — code point всегда помещается в один элемент.
lionet
Feb. 15th, 2012 08:32 pm (UTC)
А в чём удобство от того, что code point помещается в один элемент? Приведи пример?

P.S. Пожалуйста, лучше использовать UCS-4 вместо UTF-32. Название UTF-32 — это курьёз исторический.
(no subject) - sheremetyev - Feb. 15th, 2012 09:00 pm (UTC) - Expand
(no subject) - lionet - Feb. 15th, 2012 09:13 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 15th, 2012 09:47 pm (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 05:18 am (UTC) - Expand
(no subject) - sheremetyev - Feb. 16th, 2012 07:39 am (UTC) - Expand
(no subject) - _winnie - Feb. 16th, 2012 09:18 am (UTC) - Expand
(no subject) - _winnie - Feb. 16th, 2012 09:20 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 04:10 pm (UTC) - Expand
(no subject) - thinker8086 - Feb. 16th, 2012 07:37 pm (UTC) - Expand
(no subject) - Alexander Orlovsky - Feb. 17th, 2012 10:21 am (UTC) - Expand
(no subject) - voidex - Feb. 15th, 2012 08:38 pm (UTC) - Expand
ex_juan_gan
Feb. 15th, 2012 08:33 pm (UTC)
Гугл убил сто миллионов зайцев сразу, когда законодательно постановили использовать только utf8.

Все остальные решения - по глупости и невежеству.
tzirechnoy
Feb. 16th, 2012 07:45 am (UTC)
Там, в этом вашэм гугле как -- ужэ возможно читать перекупленные у dejanews архивы русского видо, или всё по-старому?
(no subject) - lionet - Feb. 16th, 2012 07:53 am (UTC) - Expand
(no subject) - tzirechnoy - Feb. 16th, 2012 10:33 am (UTC) - Expand
(no subject) - ex_juan_gan - Feb. 17th, 2012 08:05 am (UTC) - Expand
wizzard0
Feb. 15th, 2012 09:03 pm (UTC)
я полагаю, этому посту еще пойдут два замечательных в тему:

http://exit109.com/~ghealton/y2k/yrexamples.html (про даты)

http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ (про имена)
netch
Feb. 16th, 2012 09:16 pm (UTC)
Да, интересно. Сюда бы ещё добавить вот это:

http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html
max630
Feb. 15th, 2012 09:22 pm (UTC)
а в чём принципиальная разница, UCS-4 и UTF-8 вроде же изоморфны?
vle
Feb. 15th, 2012 09:32 pm (UTC)
UCS-4 имеет неоспоримые преимущества при реализации сложных алгоритмов сопоставления и поиска,
таких, например, как регулярные выражения. Попробуй нарисовать на бумаге как будет выглядеть
конечный автомат для регвыра с character classes типа [:alnum:] в utf-8 и ucs-4.
А если регвыр объемом десятки или сотни килобайт?
lionet
Feb. 16th, 2012 05:11 am (UTC)
Неоспоримые преимущества? Регулярные выражения? Достаточно в движок совать UCS-4, конвертируя строку из UTF-8 на входе. Это будет быстрее (не медленнее), чем разбирать UCS-4 изначально. Просто из-за того, что memory bandwidth более эффективно используется. При этом, трансформация UCS-4→UTF-8 — это тривиальная операция по сравнению с regex, и сложности практически не добавляет.

Кроме того, обычные движки регулярных выражений, спроектированные для ASCII, поддерживают основные свои операции на потоке из UTF-8 (например, [a-z], [0-9] будут работать без проблем), и не надо их переделывать даже под UCS-4.
(no subject) - vle - Feb. 16th, 2012 12:28 pm (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 04:28 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 16th, 2012 08:36 pm (UTC) - Expand
(no subject) - vle - Feb. 17th, 2012 12:58 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 17th, 2012 04:27 pm (UTC) - Expand
(no subject) - lionet - Feb. 17th, 2012 05:55 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 17th, 2012 07:26 pm (UTC) - Expand
(no subject) - lionet - Feb. 17th, 2012 07:35 pm (UTC) - Expand
(no subject) - sheremetyev - Feb. 18th, 2012 07:29 am (UTC) - Expand
(no subject) - sheremetyev - Feb. 18th, 2012 07:36 am (UTC) - Expand
(no subject) - lionet - Feb. 18th, 2012 12:15 pm (UTC) - Expand
(no subject) - vle - Feb. 17th, 2012 01:10 pm (UTC) - Expand
(no subject) - vle - Feb. 17th, 2012 12:56 pm (UTC) - Expand
jakobz
Feb. 15th, 2012 11:50 pm (UTC)
Вот кстати да. Не понимаю зачем в дотнете хранят двухбайтовые строки. При том еще, что str[n] - оно мало что неправильно, оно еще и провоцирует написание кривых алгоритмов, которые в 99% случаев делаются лучше и красивше всякими split/join/map/reduce/парсерами/регексами/и т.п.

Я бы вообще сжал бы яйца в кулак и убрал бы этот str[n].
lelf
Feb. 16th, 2012 06:38 am (UTC)
У меня вообще вопрос — зачем в этом веке кому-то может понадобиться $str[n] in the first place?

Если понятно, что если сделать сделать правильно, надо просматривать всю строку, а если сделать как у всех, то… то этот самый $str[n] значит полную фи^W^W^W ничего не значит.
lionet
Feb. 16th, 2012 07:41 am (UTC)
Если $str[n] не нужен, то тогда ещё меньше смысла в UCS-4.
(no subject) - _winnie - Feb. 16th, 2012 09:25 am (UTC) - Expand
(no subject) - lelf - Feb. 16th, 2012 11:12 am (UTC) - Expand
(no subject) - lionet - Feb. 16th, 2012 04:12 pm (UTC) - Expand
netch
Feb. 16th, 2012 07:48 am (UTC)
Сравнение подобного рода, основанное на том, что символ может быть несколькими кодопунктами, методически некорректно - потому, что возводит в принцип маргинальный случай. Для очень обширного пласта применений (в частности, кириллица, китайские символы, etc.) случаи комбинирования нетипичны. Возьми для теста библиотеку объёмом, грубо говоря, для каждого человека - один символ текста на его родном языке, три реализации на utf-{8,16,32}, вылижи их при сохранении формата, вызови какие-то стандартные обработки текста и сравни затраты процессора. Окажется, что utf-8 резко проигрывает за счёт сложных вычислений на каждый раз. У меня нет ссылки под рукой на это, но такие измерения я видел.

Поэтому я не могу согласиться с безусловным превосходством utf-8. Как транспорт для сети он, конечно, пригоден лучше остальных. Но давай не навязывать правила локальной обработки, тут много тонкостей вокруг.

(BTW, мерять такие вещи надо в реализации на C, а не Erlang. Последний может сильно исказить измерения своей спецификой.)
pingback_bot
Feb. 16th, 2012 10:50 am (UTC)
Как делить на слова
User _winnie referenced to your post from Как делить на слова saying: [...] Из оживлённой дискуссии у lionet [...]
cd_riper
Feb. 16th, 2012 11:35 am (UTC)
2^16 символов хватит для всех (с) Билл Гейтс в 80-м году
alexeyk77
Feb. 16th, 2012 12:08 pm (UTC)
интуитивно ощущаю, что идея сделать счастье всему человечеству, предложив одну навеки правильную систему кодирования всех символов и знаков всех языков прошлого и грядущего - коммунизм.
Такие идеи не работают и вскоре умирают.Это метафилософское восприятие проблемы.
А на практике, компьютер предназначен для считания цифр и обработки текста и эти операции должны делаться быстро. Системы, которые переусложняют эти простейшие базовые операции - основаны на неверной пардигме и должны быть нежизнеспособны в среднесрочной перспективе.
Ощущаю, что работу с иероглифами нельзя строить на тех-же абстракциях, что и европейские языки.
Мой прогноз - загнется это все вскоре.

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

lionet
Feb. 16th, 2012 04:25 pm (UTC)
Предметка сложна потому что. Объективно сложна. И нет причины, по которой она должна быть проста — это не арифметика.
(no subject) - swizard - Feb. 19th, 2012 02:52 pm (UTC) - Expand
Page 1 of 2
<<[1] [2] >>
( 137 comments — Leave a comment )

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel