LINUX.ORG.RU
ФорумTalks

Unicode-хейтеры: кто они?

 


0

3

Вот интересно, откуда у некоторых (не будем говорить кого, но все понимают, о ком я) такая ненависть к юникоду? По каким причинам его ненавидят? Предполагаю, что большинство хейтеров — ниасиляторы средств работы с длинными символами в своём любимом языке программирования. Но неужели изучить эти инструменты труднее, чем кричать на каждом углу про ненужность юникода и обрекать пользователя на трах?

Маргиналы же. Вымрут сами по себе, главное не обращать внимания.

ptarh ★★★★★
()

Вообще понять юникод трудно, да. Нет однозначного недеструктивного перехода символов из регистра в регистр и обратно. Строки, неравные при сравнении побайтово, могут быть равными при сравнении посимвольно. Ну и так далее.

shimshimshim
()
Ответ на: комментарий от Suigintou

ascii art никто не отменял:

.. ^ ' - u   `
 o a e i s S u
           ,
 '|      /                                _
.-|  \   nn   .8.  unn   nnn   n      n  |   \
._| (_) `  ' (   ) .__| `_  ' ` '    ._|  o (_)
              `''       ' \
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSXXXXXXXXSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSXXXXXXXXXXXSXSXSXSXXXXXX
XSSSSSSSSSSSSSS2S2S2S2SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS2XSSSS2XSSSSSSXSSSSSSSSSSSSSSSSSSSSSSS2S2SSSSSSSSSS2S2S2S2SSSSSS
XSS2SS2SS2SS2SSSSSSSSSS2SS2SS2SS2SS2SS2SS2SSSSSSSSS2SS2XSSSSSSSSSSSSSSSSSSSS2SS2SS2SS2SS2SSSS2SSSSS2SS2SS2SSS2X2XS2SSSS
XSSSSSSSSSSSSSSSS2XSS2XSSSSSSSSSSSSSSSSSSSSS2SSSSSSSSSS2X2m2!!!*SmoX2SS2SSSSSSSSSSSSSSSSSSS2XSS2SSSSSSSSSSS2SSSSS2XSS2X
XS2XSSSS2XSS2X2SSSS2SSSSSS2XSSS2XSS2XSSS2XSSSSSS2SSSSoXXXSY      )3XSSSSSSSSSS2XSS2XSSS2XSSSSSSSSS2SSSSS2XSSSSS2XSSSSSX
XSSSS2SSSS2SSSSSSSSSSSSS2SSSS2SSSS2XS2SSSS2SSSSSSSS2SSXoqZs      =vXXS2XSSSS2SSSS2XS2SSSS2SSS2SSSSSSS2SSSSSSS2SSSSSS2XS
XSSS2XSS2XSSSSSSS2SSSS2S2XSXSSSS2SX2SSSS2S2S2S2S2S22SXoXYwU      ]Xpn2S2S2S2SSSS2XSSSS2S2X2XS2S2X2X2SSS2S2SS2XSSSS2SSSX
XS2SSSSSSSSSS2SSSSSS2SXSXY'--~"!?Y!Y!!!!!!!!!!!!!"?!"!"!!"!-    -?!?!!"!!!??Y*111SSoSXqqXXwSXZ13YXZSSS2S2SSSSSSS2SSSSSX
XSSSSSS2SSS2SSSS2SSSSXSnS=                                                                --      ]SSSSSSSSSSS2XSSSSSSS
XSSSS2SSSSSSSSSSSSS2XSSX2q                       .....___________________.....                   =JXSSSSS2SS2SSSSSS2SSS
XS2SSSSSSS2SSS2SSSSSSSSS2#.     .]ZXS2S2oww2XdXXS2SSXXS2SSSXXXZZZZZZXXXXXXXXSXXXZZXXXXXSoX|     <uX2SSSSSSSSSSSSS2SSSSS
XSSSSSSS2SSSSSSSS2SSSSSSSS;     .]nX2Zm""""""!"!"!"!"!"!""!"!"!"!"!"!"!"""""?"!""""{XEXoXS     .]SS2S2XXSSSSSS2SSSSSSSS
XSSS2SS2XSSSS2SSSSSSSSSoSX(     :j2ZoZv                                            <2SXXSm     =JSS2XSSSSSS2SSSSSSSS2XS
XS2SSSSSSSS2XSSSSSS2SSSX2X(     <uXSXXw_.. ____s_as_a.      _<ac_as,_a_s_s_aa,s_a,au2SwXSn     ]u2S2X2XSSSSSSSSS2SS2XSX
XSSSSSSSS2XSSSSSSS2XSSSXXX(. ..)dSXoXon#XqqZAX#o2!^`      ._XXowwZSX#SXXXXXXnXmXSXXndSoSXoas__vJXnX2SSSSSSSSSS2SSSSSSSX
XSSSS2SS2XSSS2SSSSSSSS2S#oSoqmZ2S21Y??!!""-                "SdX2XXnoXSS22XXSS2XSX2}'   -SVwX2XSdSSS2S2S2SS2SS2XSSSSSSSS
XS2SSSSSSSSS2XSSSSSSS2XoXXX[.                   _s,avXs_:   -^]ZoXZXZoXZXIvmoq2!^`      qgvXSSS2SSSSSSSSSSSSSSSSS2SS2SX
XSSSSSS2XS2SSSSSSSSS2XSoUodXq/.            .<aaoqp2S22XqV      )5ZY!""S22VZoI'        avVwXSSSSXSSSSSS2SSS2XSSS2XSSSSSX
XSSS2SSSSSSSSSSSSSSSXSSXoXGood6s_ss_s_s_avSXoo2SwuXe"!"    .    -)(    ~?"~~      _a_J2XXoSSSSSSSSSSSSSSS2XSS2SSSSSSSSS
XS2SSSSSS2XSS2XSSXSSSSSXXXSSSS2SS2oS2ZXSXww2XGZe"^       _wV(     =s,         _aJSZSXXSXXXSSSSSSSSSSSSSSSSSSSSSSSS2SS2X
XSSSSSS2SSSS2XS2S22S22SoS22S2SSXSSSXwX2X1!!`         as1mXnXS[.    :3Va_      -"5dSoS22S2SSS2SSS2SSS2SS2XSS2SSS2SSSSSSX
XSSSS2SSSSSSSSSXX22XqSS222*?!""""""""~-         __a%XnU2nXmn"'      )wXXsa_      -"!!3qo2SSSS2SSXS2SXXXS2SSSSSSSSSSS2XX
XS2SSSSSSS2SSSSX23XZ~                       _<auZ#SoXw2Sm1^          XoZn2Bw_         "!XXwXnSXooXXXSo2SSSSSS2SSS2SSSSX
XSSSSSSS2XSSS2SodX2X#a_               __auXXXXX2XSoomX!      _v(     #Xn22SSoGa,           ""YodZXoXoX22SSS2SSSSSSSSSSS
XSSS2SS2XSSSSSSXoXVSu2Zos_    . __ssoXX#2oX2ooSX2XZr-       Jdf.     XSoX2SoXSddt,             -""!{3SX2SSSSSSSS2SSS2SX
XS2SSSSSSS2SS2XSXXSSXXSXSoXXXXdXXX22So1Xwowm27!'         a2XVC'      Z2XoX2XXoooZXXa,                     XSSS2SSSSSSSX
XSSSSSSSSSSSSSSSSSSS2SSqXSXo2oXSXZ#XX1?""""`         _a=WuSXr'.     _XXS2XSS2XXXXop3Ss_.               _avXS2SSSSSS2SSX
XSSSS2SS2SSSSSSSSS2SSSSnoX?!"?""~-                .<Zw2Soom1'       ]SSnXXoXSSSSSSodSdZqi            _sSooXSSSSSS2SSSSX
XS2SSSSSSSS2SS2SS2XSSSSoS#(.                 ._jdSX#SXwo?^         ]oS2SSSXXSS2SSSXSXXX22Xws__saa%dZXSSS2oXXSSS2SSSSSSX
XSSSSSS2XSSSSSSSSXSSS2XXX2dLa,,        ._s_aJU&o3Y(--            _%oSS22SSXXSSSXS2X2XoXXSSXX##ooXSnooXSoXXXSS2SSSSSSSSS
XSSS2SSSSS2SSSSSSSSSSSS2SwXXudVhaaasaaUXXXXS2XSSXXc.            =vXXS22SS2XXSSSSSXSX2XSoXS2oXSodXSodXSnXSSSS2XSSSSS2SSS
XS2SSSSSS2XSS2SSSSSSS2XSSS2SSXS222oo2SSSSSSSSSooXX36s_.      _sJXX2S2XSSSSSSSSSSSS2XSSSXSSSXSSXSS2XXSSXSS2SSSSSS2SSSSSS
XSSSSSS2SSSSSSSSS2X2SSSS2XSSSSSSXXXXXXSS2XSSS2XXXXXo2XqwoaaaZUho3SodXSSS2XSS2SS2SSSSSSS2XSSS2XS2XSSSSS2XSSSSSS2XSSSSSSS
XSSSS2SSSSSS2XS2SSSSSSSSSSSS2SSSSSSSSS2SSSS2XXXXSXX2SX22XX2XXSoXS222SSS2XSS2XSSSSSSS2SSSSS2SSSSSSSSS2SSSSSS2SSSSSS2SS2X
XS2SSSSSSSS2XSSSSSSSSSS2SS2SSSS2SS2SSSSSSSSSSSS2SSSSSSSXSSSSS2XSSSXXSSSSSSSSSSSSS2SSSSS2XSSSSS2SSS2SSSSSS2SSSSS2SSSSSSX
          oo        n       5                  8         6         2         2
.--'  1    _    (-1)       2         1        2         2         2         2         1
 || = --- \    ------ (- ------ - ------ + ------- - ------- - ------- - ------- - -------);
       6  /_     10n     4n + 1   4n + 3   10n + 1   10n + 3   10n + 5   10n + 7   10n + 9
      2  n = 0  2
             oo     n
              _    x
-ln(1 - x) = \     --; for |x| < 1
             /_    n
            n = 1
                                    xxxxxxx
                               x xxxxxxxxxxxxx x
                            x     xxxxxxxxxxx     x
                                   xxxxxxxxx
                         x          xxxxxxx          x
                                     xxxxx
                        x             xxx             x
                                       x
                       xxxxxxxxxxxxxxx   xxxxxxxxxxxxxxx
                        xxxxxxxxxxxxx     xxxxxxxxxxxxx
                         xxxxxxxxxxx       xxxxxxxxxxx
                          xxxxxxxxx         xxxxxxxxx
                            xxxxxx           xxxxxx
                              xxx             xxx
                                  x         x
                                       x
Ну и т.д.

saahriktu ★★★★★
()
Ответ на: комментарий от border-radius

Нехорошо обзывать инакомыслящих. И, вообще, так и до фашизма недалеко. Одно мировоззрение, одна кодировка, один народ,...

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

это на своём локалхосте можно шрифты явно задавать, а вот как они у других пользователей будут отображаться, ты на это повлиять не можешь

Harald ★★★★★
()
Ответ на: комментарий от PolarFox

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

Вот за это я ненавижу std::string и iostreams. Крайне неудобно само по себе, а если под виндой (где юникод в API через wchar_t и UTF-16) то вообще капец боль((((

Uter
()
Ответ на: комментарий от KennyMinigun

явление «слетевшей кодировки»

У меня постоянно слетает между utf-8, utf-16, utf-32 и escaped.
Причём, периодически понять, что произошло, труднее, чем с однобайтовыми.

Shadow ★★★★★
()
Ответ на: комментарий от vurdalak

По всему интернету можно найти множество современных сторонников KOI8-R. Такие есть даже во Вконтакте: http://webcache.googleusercontent.com/search?q=cache:HfMngnwz6rYJ:http://vk.c...

PS. Гм. Гугл уже успел подчистить кэш. Но, там было про «Как нам заставить всех перейти на Кои?» и «Россия за Koi8-r!». От декабря 2015-го.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 3)
Ответ на: комментарий от vurdalak

Моношинность - тоже полезно. USB во всех своих ипостасях избавил нас от бремени проприетарных разъёмов. Только законченные проприерасты головного мозга этого не поняли и сидят на своих лайтнингах.

Собственно, та же фигня, что и с кодировками.

border-radius
()
Последнее исправление: border-radius (всего исправлений: 1)
Ответ на: комментарий от saahriktu

тексты занимают меньше места на носителях и в оперативке и быстрее обрабатываются

Какого у тебя там года железо?

sudopacman ★★★★★
()
Ответ на: комментарий от sudopacman

Ну, люди, конечно, разные, и, вероятно, есть ещё те, кто не могут такое читать.

saahriktu ★★★★★
()
Ответ на: комментарий от border-radius

«Хорошо себя чувствует» и «экономия ресурсов» - это разные вещи. Тем более, что можно выполнять только те действия, которые не требуют активного перелопачивания локальных файлов. А при активном перелопачивании локальных файлов железа может уже и не хватить.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

ЩИТО, простите?

Твой греп не умеет в юникод без выжирания ресурсов железа 2011 года?

Тогда меняй дистрибутив. Или отношение к жизни. А лучше и то, и другое.

border-radius
()
Ответ на: комментарий от border-radius

нормальные браузеры рендерят всё

lynx, кстати, тоже умеет работать с юникодом. Если я сейчас переключу локаль на UTF-8, то специфические юникодные символы будут отображаться. Квадратами. Но, умеет также и транслировать в однобайтные кодировки.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Да-а-а, величайшее достижение: lynx умеет работать с юникодом на терминалах, которые умеют работать с юникодом. Но браузером он от этого не становится.

border-radius
()
Последнее исправление: border-radius (всего исправлений: 1)
Ответ на: комментарий от saahriktu

ССЗБ

Если такая постановка задачи возникает, значит, у тебя архитектурно уже всё очень плохо. И нечего на юникод пенять.

Такие вещи в БД хранить надо, вообще-то. И индексы нормальные строить.

border-radius
()
Ответ на: ССЗБ от border-radius

Так речь не про специфический софт, а про обычное бытовое использование: поиск требуемого слова/требуемой фразы в куче книг и текстов. Юзер не обязан помнить что у него в какой книге/каком текстовом файле, тем более что всегда можно погрепать.

PS. Текстов у меня, кстати, ещё больше.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от petrosyan

SMS'ки уже давно не писал. Звонки, электронная почта, джаббер,...

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Во-первых, если объём текста - 15-30 гиг в сжатом виде, то в виде кучи файликов его хранить уже нерационально. Запили каталогизатор, тот же скулайт должен справиться. Искать будет гораздо комфортней, чем обычным грепом.

Во-вторых, попробуй погрепать фразу на греческом со своим несчастным кои8.

border-radius
()
Ответ на: комментарий от saahriktu

strncpy, strncmp, printf,... и другие неюникодные функции;

Можно переместить указатель на подстроку со смещением N символов просто прописав strptr + N;

Тебе, кажется, рассказали, как это делается. Вместо char используем wchar_t (либо какой-то другой тип данных, если нужна совместимость с разными компиялторами), вместо функций str*** используй функции wstr***. Строковые литералы объявлять через

L""
. Далее программа должна считать системную локаль (тебе там писали, как это делается). И всё, она будет правильно работать вне зависимости от того, какая кодировка в системе.

te111011010
() автор топика
Ответ на: комментарий от te111011010

Покажи мне пример кода, выполняющий одну и ту же функцию в первом случае с однобайтной кодировкой, а во втором — с utf8.

Например, какой-нибудь сложный поиск, когда надо какую-нибудь метрику для строк использовать, выражения вида if (s=a[j])&&(s[i+n-1]==a[j+k]) {...} или там хэш от смиволов подсчитать, то есть, когда со строками хорошо как с массивами обращаться. В некоторых случаях utf8 позволяет игнорировать переменную длину символов, например, если их надо просто скопировать, хэш иногда можно считать, не обращая внимания на отдельные символы.

В случае с utf8 надо использовать готовые функции или выделять символы чем-то вроде Substr(s,i,1) и т.п. - это медленно. Даже если сделать перегрузку операторов и скрыть детали доступа, чтобы обращаться как будто бы с массивом, всё равно это потеря производительности.

Серьёзно, если текст заведомо влезает с однобайтовую кодировку (или можно пренебречь, тем, что не влезло), код для работы с ней получается самый быстрый и простой. Экономия памяти сейчас не столь актуальна, но опять же смотря на чём. Просто на хранении символов это одно, а если использовать распределительную сортировку без промежуточного хэширования, то тут уже в однобайтном случае всё кратно 256, в двубайтном 65536, а в 4-х байтном уже 4G и это становится сильно неудобно.

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

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Чем вас wchar_t или char32_t не устраивают? Сдвиг работает, функции, аналогичные функциям работы со строками, есть.

te111011010
() автор топика
Ответ на: комментарий от te111011010

Там же объясняли и то, что не каждый элемент wchar_t является символом. Есть и модификаторы, и более сложные случаи. И всё это по-хорошему нужно учитывать и применять. А то в ряде случаев оно может и не сработать. С однобайтными кодировками таких проблем нет.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Да хоть в морзянке, говорю же, ты не понимаешь, что ли, что СУБД позволяет организовать хранение и индексацию текстовых данных такого объёма оптимальнее любой ФС?

Отключись от интернетов, ты безнадёжен. Зато у тебя есть 30 гиг всякой ерунды в недокодировке, будет что почитать.

border-radius
()
Ответ на: комментарий от saahriktu

не каждый элемент wchar_t является символом.

Не понял.

Есть и модификаторы

Которых в однобайтных кодировках нет?

te111011010
() автор топика
Ответ на: комментарий от anonymous_incognito

Серьёзно, если текст заведомо влезает с однобайтовую кодировку (или можно пренебречь, тем, что не влезло), код для работы с ней получается самый быстрый и простой.

Ты, когда пишешь программу, которой будут пользоваться другие люди, не можешь предугадать, какие тексты будут ею обрабатывать.

te111011010
() автор топика
Ответ на: комментарий от te111011010

Которых в однобайтных кодировках нет?

В том-то и дело. Здесь каждый байт - один символ, и наоборот.

Не понял.

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

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

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

Но таких символов же нет в однобайтных кодировках.

te111011010
() автор топика
Ответ на: комментарий от te111011010

Вопрос не стоит так, что в unicode нельзя сделать то, что можно в однобайтной кодировке. Можно. Но в однобайтной бывает, что проще, быстрее и меньше памяти, иногда существенно быстрее и существенно меньше памяти, и не в 4 и не в 8 раз меньше, а в десятки тысяч раз меньше на одном и том же алгоритме.

Ты вообще что-нибудь сложное делал со строками? Например, что-то вроде быстрого нечёткого поиска для одновремённо тысяч образцов? В таких случаях стандартные функции для работы со строками можно сразу выкидывать.

В этом случае utf8 не годится в принципе, а char32_t имеет следующие недостатки:

- 4 байта, вместо 1-го. Как я уже сказал, иногда это выливается в 65536 раз больший расход памяти.

- utf-32, используемый в данном случае, тоже может не всегда гарантировать, даже что один и тот же текст имеет одинаковую длину. Например, русская «й» может быть представлена одним символом (4 байта), а может быть проведена декомпозиция и нормализация (NFC, NKFD, NFKC) и тогда это будут два символа: и + ̆

И вот, если потребности в многоязычном (более двух) представлении и особых символах нет, может оказаться проще и надёжнее использовать однобайтную кодировку. Конечно, если вдруг всё это понадобится придётся переделывать.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от te111011010

Ты, когда пишешь программу, которой будут пользоваться другие люди, не можешь предугадать, какие тексты будут ею обрабатывать.

Конечно, если пишется что-то универсальное, скорее всего, придётся учитывать юникод. А если, например, какой-то data mining по уже имеющемся залежам данным, для которых заведомо ясно, что юникод не понадобится, его может и нет смысла использовать.

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

anonymous_incognito ★★★★★
()
Ответ на: комментарий от saahriktu

Давно не видел на ЛОРе ничего более идиотского. А я слежу за тредами Светоча.

templarrr ★★★★★
()

https://stackoverflow.com/a/6163129/1590113

Вот это стоит прочитать каждому, кто думает, что Юникод — это просто.

Он сложен, но это объяснимо сложностью естественных систем письменности. И многие не понимают, зачем им все эти навороты, когда для их локали хватает какого-нибудь ASCII или KOI-8, где всё просто и влезает в один байт.

ilammy ★★★
()
Ответ на: комментарий от sudopacman

Ну, UTF-8 поддерживает огромное количество символов, те же иероглифы, например, а не только символы двух азбук.

У жапов та же проблема только у них не однобайтовые, а японские многобайтовые кодировки.

BlackJack
()
Ответ на: комментарий от te111011010

Вместо char используем wchar_t (либо какой-то другой тип данных, если нужна совместимость с разными компиялторами), вместо функций str*** используй функции wstr***.

Мелкомягкие извратились создав свой тип tchar с определением

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
////
#ifdef _UNICODE
#define _tcslen wcslen 
#else
#define _tcslen strlen
#endif

#ifdef _UNICODE 
 #define _T(c) L##c
 #define TEXT(c) L##c
#else 
 #define _T(c) c
 #define TEXT(c) c
#endif
[\code]
Соответственн вызвав


int z;
TCHAR a[50]=_T"Техт"
z=tcslen (a);
[\code]
Мы получим в z число символов при любой кодировке. 
BlackJack
()

Это люди ушибленные мерзостной koi-8 во времена полового созревания. Не лечиться.

ranka-lee
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.