LINUX.ORG.RU

Разыскивается сишка, но с юникодом из коробки

 ,


2

5

САБЖ. Ищется относительно простой (не C++), но быстрый язык с полноценным юникодом из коробки, хочу в питон батарейку клепать, так как готовая библиотека на ванильном питоне (не моего производства) на пару порядков по скорости проседает от того, что я бы хотел видеть и да, я точно знаю что это возможно, так как есть проприетарщина на крестах, которая могёт (но авторы бабосика уж очень много хотят). При этом не очень хочется заниматься любовью и лишней магией на указателях с utf-8, utf-16 и utf-32 посредством всяких костылей.

Интересно, как там у ржавого и го с юникодом и производительностью.

★★★★★

Что библиотека делать-то должна?

У Go с производительностью неплохо, но не блестяще, с юникодом прекрасно. Ты точно хочешь целый рантайм тащить со своим GC?

WitcherGeralt ★★
()
Ответ на: комментарий от deep-purple

Совсем не желаю. Там без колхоза строк и прочих радостей кода будет на пол сотни файлов (а ведь ещё отладить надо всё хорошо). А с колхозом я как раз к пенсии справлюсь. Ну и да, мне надо уметь ходить по буквам и по словам в строках, да и вообще я бы utf-32 предпочёл во внутреннем представлении. Памяти не так жалко, как важна скорость сдвига от одной буквы к другой, а с utf-8 там плавающий размер у букв.

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

с полноценным юникодом

Что нибудь кроме icu и обёрток над ней уже умеет в такое? Го скорее всего мимо, ибо скриптуха, а такое не умеет в полноценный юникод

$ string toupper grüßEN
GRÜßEN

DllMain
()
Ответ на: комментарий от peregrine

utf-8 там плавающий размер у букв

Да. От 1 до 6 байт. И в первом байте указано сколько ещё байт надо прочесть до полного символа:

if (firstByte < 128) {
    moreLen = 0;
} else if (firstByte < 224) {
    moreLen = 1;
} else if (firstByte < 240) {
    moreLen = 2;
} else if (firstByte < 248) {
    moreLen = 3;
} else if (firstByte < 252) {
    moreLen = 4;
} else {
    moreLen = 5;
}
М? Вычитай единожды из исходной строки в своё внутреннее представление (какое захочешь, хош велосипед (символ всегда размером в 6 байт), хош утф-32) и пользуй.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от peregrine

подключаешь libicu последней версии и вот у тебя полноценный юникод из коробки, со всеми эмодзи какашек

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

Он всё верно говорит. Те, кто кукрекает про жирность и тормоза, будут в лучшем случае полгода пилить свою «легковесную» реализацию, которая в итоге достигнет той же функциональности и будет ещё толще

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

Не достигнет — так же куча еще всего другого, не нужного в данном контексте, а тут только то что нужно. Так что возможно это оправдано. Но не нам решать.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

Очевидный Rust.

У Go с unicode всё своеобразно, как обычно. Но он всё равно не подходит для написания либ.

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

А полноценность включает в себя объединение нескольких символов/мнемоник и прочих умляутов в один? Ну, т.е. редактирование и/или нормализацию. Если нет — то достаточно вон тех строчек кода что я выше скинул. В противном случае надо тащить с собой все эти таблицы сопоставлений и прочее. Вот тогда да — проще взять готовое.

deep-purple ★★★★★
()

Иногда очевидный Rust такой очевидный.

slaykovsky ★★★
()

относительно простой (не C++)

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

anonymous
()
Ответ на: комментарий от deep-purple

Как бы критерий полноценности - поддержка всех операций и преобразований, определённых в стандарте юникода. Я во всяком случае так понял, а уточнений не было. Поэтому я и говорю:

проще взять готовое

DllMain
()
Ответ на: комментарий от anonymous

Кстати, лорчую сайтон. Можно просто типы расставиь и нахаляву получить прирост в производительности. Я бы забенчил.

WitcherGeralt ★★
()

Ну тут сишка как раз и нужна =) Ну vala можно взять если хочется, батареек. Чё там ещё chichen shemie если не боишься лиспов. И то и то в си транслируется. А в ржавом смысл? Всё равно там специальные типы, функции обработчики как в той же сишке будут. Короче сишка и любая удобная тебе утилитарная библиотечка для utf-8 и всё. Или храни строки в uint32_t и насрать тогда вообще на всё =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от peregrine

utf-8. utf-32 имеет смысл если у тебя оперативка резиновая и размер кешей в проце гигабайт. Но если у тебя текста эмм ну метра 3 обрабатывать надо то пофиг юзай 32

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от peregrine

Ну для начало нужно нормализацию выполнить, а потом сегментировать. В расте для этого всё есть (unicode-normalization + unicode-segmentation).

Но опять же, всё зависит от исходных данный. Вы бы хоть пример привели.

RazrFalcon ★★★★★
()

А что надо от юникода-то? Много дебилушек не осознаёт что в большинстве случаев для работы с юникодом ничего не нужно кроме байт. 90% случаев - хранение, передача, форматирование, конкатенация - байты. Ещё 9% - поиск подстроки, split, токенизация - опять байты. Именно поэтому поддержка юникода есть в сишке и вообще везде. А оставшиеся 1% - icu. Есть и C и C++.

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

Ну скажем, посты на ЛОР-е по словам разобрать, каждое слово уметь нормализовать, выкинуть все символы не являющиеся символами заданных алфавитов, привести все слова к начальной форме, ещё неплохо уметь часть речи определять и член предложения в случае русского языка. Сейчас через кучу медленного говна, вроде pymorphy2, NLTK в основном это делаю. Особые нарекания по производительности к pymorphy2. Захлёбывается даже оптимизированная версия (ну как захлёбывается — 20 мегабайт текста лопатит по часу в случае оптимизированной версии и по 6 часов в случае обычной, ясно что я пока с ним воевать буду, но похоливарить уже можно, пока оно будет 2 гигабайта текста через себя прокручивать в один поток — там сотню часов ждать: 2*1024/20*58/60), ну и то, что он только для русского адекватно работает печалит.

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

форматирование, конкатенация - байты

байты

Oh, boy…

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

посты на ЛОР-е по словам разобрать

https://unicode-rs.github.io/unicode-segmentation/unicode_segmentation/index.html

выкинуть все символы не являющиеся символами заданных алфавитов

https://docs.rs/unicode-script/0.5.0/unicode_script/trait.UnicodeScript.html

неплохо уметь часть речи определять и член предложения

Ну это не unicode уже. Да и вообще нетривиальная задача.

PS: я тут как раз переписываю одну питоновскую прогу с питона на раст. На данные момент в 60 раз быстрее оригинала, но я ещё не всё реализовал.

RazrFalcon ★★★★★
()

Так си же, C99:

$ man wcslen
...
CONFORMING TO
       POSIX.1-2001, POSIX.1-2008, C99.
sergej ★★★★★
()
Последнее исправление: sergej (всего исправлений: 1)

Ну конечно D. юникод из коробки плюс отличная интеграция как с сишечкой, так и с питоном.

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