crypt of decay - пиздецома на иксах [entries|archive|friends|userinfo]
ketmar

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

пиздецома на иксах [Nov. 16th, 2013|07:11 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
я вообще в диких непонятках с Xutf8DrawString(). если у меня локаль koi8 и я делаю setlocale(LC_ALL, ""), то эта блядина рисует только utf8-буковки, а на обычный ascii срать хотела. а если делаю setlocale(LC_ALL, "utf-8"), то она рисует ascii, но срать хотела на utf8. они там марсианцы были, или просто неизлечимое рукожопие?

но это ещё не всё! если запиздячить локаль «ru_RU.UTF-8» и использовать Xmb, то текст в UTF-8 выглядит классическим «яыоуы» с умляутами, а с KOI8 не печатается вообще. Xutf8 в этом случае даёт ещё более интересные результаты: утф-ный текст выглядит как «'2'e'c'c'\'Z'[« и так далее (и не спрашивайте, каким образом оно это сочинило), KOI8 не печатает вообще (что логично).

для локали KOI8 Xmb честно рисует в кодировке KOI8, конечно. я пиздец как рад просто.

итого: нарисовать UTF-8 текст при помощи core fonts без изъёбов невозможно в принципе. надо писать говнокод, который часть строки будет рисовать через Xmb, а часть — через Xutf8. знаете что? идите нахуй со своим хлебушком! Xft с utf-8 справляется отлично, и на установки локали ему срать с колокольни. конечно, Xft говноговноговно, и я бы хотел оставить вариант с X Core Fonts, но… в пизду хомячка. не хочу я это уёбство поддерживать и не буду.

p.s. кастую сюда товарища tzirechnoy, чтобы он пояснил мне, что это на самом деле я мудак, всё сделал неправильно, а правильно надо совсем не так.

upd: каст сработал, и выяснилось ЭТО:
PS Да, кстати, проверил. Xmb*, разумеется.
Поначалу — УМВР. Потом сломалось, и выяснилось, что почему-то первым надо создавать фонтсет в koi8-r — иначе работает только utf8. То есть создал первым в utf8 — koi8-r сломано, создал первым в koi8-r — потом можно делать и то и другое.
Кодировку XCreateFontSet запоминает, и на текущую при рисовании — плюёт (что логично).

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

я в ахуе, x core fonts в нахуе.

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

Comments:
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 10:30 am
(Link)
А зачем ты пользуешься Xutf8DrawString?
Когда на моих иксах кто-то захчет скомпилять что-то с Xutf8DrawString, ему удалится исходник.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 11:37 am
(Link)
как я написал — без разницы: ни одна нормально не работает. пичалечка.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 11:51 am
(Link)
К компу подбегаю только на секунды -- так что проверить сложно, но. Скорее всего. Не знает кодировку шрифта.
(ему лучшэ всего давать шрифты, точнее, сеты, в которых есть iso10646-1).
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 05:28 pm
(Link)
great. i don't fuckin' know what's going on here. fuckin' same code works in your sample but shits itself in my toolkit.

не, риальне. твой примерчик всё охуенно печатает. XFontsOfFontSet() возвращает точно тот же список, что и у меня. setlocale() то же самое — «ru_RU.utf-8». but your code prints all three strings and my prints only fuckin' ASCII, and translates UTF-8 to some strange latin1 it seems, and prints nothing for KOI.

не, риальне. XCreateFontSet() то же самое, я строчку шрифтовую скопипастил. setlocale() запиздячил в кучу мест. XmbDrawString() набран одним и тем же терминусом, блядь. но твой пример работает, а у меня хуйню порет.

кстати, точно такую же хуйню у меня пороло в терминалке, и там я сделал хак с попеременным использованием XmbDrawString()/Xutf8DrawString() — в зависимости от символов в строке — и так оставил.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 11:58 am
(Link)
Слушай, я не пойму: а что ты понимаешь под "обычный ASCII"? Вроде у всего, что меньшэ 127 и есть isprint() -- не можэт быть проблем в UTF8.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 05:31 pm
(Link)
>а что ты понимаешь под «обычный ASCII"
ровно это: обычный ASCII. символы из диапазона [0..127].

и да, оно может и «не может», но оно есть.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 12:12 pm
(Link)
А, ещё банальное: локаль при создании FontSet и вызове XmbDrawString -- должна быть одна и та жэ.

Точнее, XFontSet создаётся для той локали, которая указана при его создании. Что будет, если рисовать с другой локалью -- не знаю, но вряд ли что-то хорошэе.

Это, разумеется, в первую очередь про LC_CTYPE.

PS Да, кстати, проверил. Xmb*, разумеется.
Поначалу -- УМВР. Потом сломалось, и выяснилось, что почему-то первым надо создавать фонтсет в koi8-r -- иначе работает только utf8. То есть создал первым в utf8 -- koi8-r сломано, создал первым в koi8-r -- потом можно делать и то и другое.
Кодировку XCreateFontSet запоминает, и на текущую при рисовании -- плюёт (что логично).
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 12:14 pm
(Link)
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 05:34 pm
(Link)
А, ВОТ ОНО, ДА!. вот этот постскриптум я сразу не прочитал. а теперь прочитал. действительно, добавил в начало создание бесполезного фонтсета в системной локали — всё заработало.

блядь, что это? отчего это? зачем такая хуйня?! «да мы все ебанулись чтк упчк», блядь?!
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 07:33 pm
(Link)
Это баг. Просто баг. По первому взгляду -- похожэ, что такая у нас поддержка Utf8, что иницыализацыя её поддержки добавляет какую-то нерабочую херню в списки поддержки локали (и только рабочая херня там до того можэт её перекрыть).

В общем, копать надо в районе _XOpenLC().
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 08:07 pm
(Link)
да я понимаю, что баг; это я так, занервничал от охуения. потому что сей баг мне изрядно нервов попортил ещё во времена терминалки.

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

ну, что делать — впилил хакфикс, конечно.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 05:41 pm
(Link)
охуенно благодарю. я бы хуй догадался вот на такой нюанс внимание обратить. это пиздец.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 12:33 pm
(Link)
А, ещё вариант: у тебя нет локали ru_RU.utf-8
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 12:38 pm
(Link)
И да. Правильная прибитая гвоздями кодировка -- это или ASCII-7 или коды телетайпа. Адобовские имена и иксовые символы -- это ещё куда ни шло (поскольку это не совсем кодировки) (хотя с иксовыми символами тожэ надо что-то делать).
За всё остальное -- надо сразу убивать. За utf-8 -- в особенности.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 05:30 pm
(Link)
я согласен, что за utf-8 ржавым рашпилем ебать ебать ебать, но на данный момент это самый простой способ выводить что-нибудь на рюсске, и чтобы это увидел не только я и остальные два инвалида, у которых локаль до сих пор koi.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 07:35 pm
(Link)
Понимаешь, в том-то и дело, что в utf-8 нет в общем ничего особенного. Кодировка как кодировка.
Но если это оказывается единственная гвоздями прибитая кодировка -- то, значит, никакой поддержки кодировок в приложэнии нет, и все что-то сосут.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 08:09 pm
(Link)
ну, я вот делаю не поддержку кодировок, а поддержку юникода. так что мне можно прибить к тулкиту гвоздями utf-8.
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 10:57 pm
(Link)
Вот именно за "поддержку юникода" я таких как ты и нелюблю.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 11:03 pm
(Link)
у тебя есть более другие предложения? которые не включают в себя движок перекодировок туда-сюда и не заставляют говорить юзерам «ололо, ну ты лох, установи системную локаль в koi8, если хочешь русский, обезьяна тупая!»?
From:[info]tzirechnoy.livejournal.com
Date:November 18th, 2013 - 11:06 pm
(Link)
1) Разумеется, движок перекодировок. Из <<кодировки документа>> в <<кодировку системы>>. Притом документом можэт быть кто угодно -- включая твои файлы i18n.
2) Какая разница -- установит юзер локаль koi8-r или utf8? Не понимаю. У юзера есть локаль, которая его почему-то устраивает, ты запущен в этой локали, в ней и показывай.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 11:12 pm
(Link)
l10n я не делаю принципиально (языка Цивилизации достаточно). а писать лишний код, чтобы во-первых, строковые константы упорно перекодировать, а во-вторых, обрабатывать однобайтные/многобайтные кодировки (или опять кодировать туда-сюда) я не хочу.

utf-8 уёбище, конечно, зато поддерживает большинство юникода (ну, точнее, unicode plane 0, кто туда не попал — тому крупно неповезло). а перекодировками пусть за меня занимаются системные библиотеки — иначе нахуй они нужны вообще?
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 11:59 am
(Link)
1) utf-8 -- это гениально. Оно поддержывает вполне весь имеющийся юникод. Ограничения на plane у него особо нет. По сравнению с теми предложэниями по 8-бит кодированию, что были до него -- ну, вот видно, что такое гений и чем гений отличается от посредственности.
2) Проблема именно в юникоде-локе. Да, юникод -- это только одна из кодировок. Тот факт, что она включает в себя koi8-r, windows-1251 и кажэтся дажэ cp866 -- этого не отменяет. Сама претэнзия авторов юникода на создание универсального набора символов -- это очень смешно. Они решыли, что один комитет можэт взять и описать все символы, которые использует человечество.
3) Надо понимать, что ужэ сейчас вполне есть кодировки, которые содержат символы, которых нет в юникоде. Некоторых, кстати, нет в юникоде по политическим мотивам.

Потому за создание API без поддержки кодировок -- надо просто матумбу устраивать.
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 04:02 pm
(Link)
1. у utf-8 ограничений нет, у меня есть: мне лень surrogate pairs поддерживать. от слов «нахуй не хочу».

2. но других универсальных особо нет.

3. да мне вообще насрать на всякие спецсимволы и экзотические языки. арабские там, японские, китайские, правоналевные и прочую хуйню. если вдруг кому-то это надо — он ебётся с этим самолично. я и input methods не поддерживаю по тем же причинам.

я не пишу очередной Qt или GTK, мне достаточно поддержки английского и русского в utf-8. всё остальное — оверинжиниринг.

если бы я писал очередной большой универсальный тулкит — там бы я заморачивался кодировками, локалями и прочей хернёй. а в данном случае делать код, которым не будет пользоваться вообще никто — даже я — не вижу смысла.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 04:42 pm
(Link)
>1. у utf-8 ограничений нет, у меня есть:
> мне лень surrogate pairs поддерживать. от слов «нахуй не хочу».

Бгг. utf-8 не требует использования surrogate pairs. Оно вылезает только из кривых конвертэров из utf-16. А ucs-2 и utf-16 -- это всё совсем глупая шыза (которая, впрочем, наглядно показывает, что было бы с 8-bit unicode если бы не свт.равноап. Кен Томпсон).

2. но других универсальных особо нет.

Есть. EUC-JP (ISO1022), BIG5. Поддержка русского в шрифтах, правда, умеренная (типичный шрифт считает русский двойной шырины символом) (кстати, от этого такая веселуха в дефолтных шрифтах tcl/tk под иксами -- оно ищет символы, притом кириллицу находит в какой-то корейской херне).
И вообще, зачем тебе универсальная? Если я говорю, что у меня koi8-r -- то зачем тебе что-то ещё? Я наверное не зря так говорю, и символ номера мне нахер не упёрся.
Вот скажу, что у меня utf8 -- ну, будешь рендэрить utf8.


И вообще, для "английского и русского" -- вполне достаточно koi8-r. Ну, можэт cp1251. Нафиг большэ?
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 05:18 pm
(Link)
>utf-8 не требует использования surrogate pairs.
хм. и вправду. чего это я…

>кстати, от этого такая веселуха в дефолтных шрифтах tcl/tk под иксами
и не только у tk, некоторые терминалы и ещё что-то этим же болело.

>И вообще, зачем тебе универсальная?
затем, что я не хочу писать перекодировщики. не-хо-чу. вот у меня в сишном коде создаётся метка, а к ней строковая константа-заголовок на русском. я очень рад, что у тебя, например, koi8. а у меня — гост какой-нибудь, например. ну, или наоборот. и вместо русского ты видишь говно. а если у тебя utf-8, а у меня koi — то и вообще нихуя не видишь, потому что невалидная utf-последовательность.

так вот: писать перекодировщик этой херни под локаль мне лень. поэтому жестоко выставляем локаль в utf-8 и все строки храним в ней же.

и да: я рад за твой koi8. и за свой рад. а если мне надо вывести текст, где есть символы, отсутствующие в koi8 — мне из как кодировать? молитвами, что ли? в случае «у нас всё в utf-8» эта проблема тоже есть, конечно, но намного менее заметна.

>Нафиг большэ?
хочу значок радиационной опасности, серп с молотом и свастику.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 09:35 pm
(Link)
>хочу значок радиационной опасности, серп с молотом и свастику.

А я -- plqaD. Ну, или ладно, носителей клингонского я пока не встречал -- но хотя бы тэнгвар. И не надо говорить про "завтра".
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 11:11 pm
(Link)
в юникоде есть? шрифт есть? как-нибудь нарисует.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 11:50 pm
(Link)
>в юникоде есть?

Разумеется, нет. Чего бы иначе я стал это приводить в пример.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 09:42 pm
(Link)
>вот у меня в сишном коде создаётся метка, а к ней строковая
>константа-заголовок на русском.

Это означает, что у тебя в коде или явно должэн быть обозначен использованный charset, или тебе надо пройти в биореактор. Нет, "подразумеваемые" в разное время на одной шэстой части сушы utf8, windows-1251, cp866, EBCDIC-01025, МТК-2 -- это херота, поскольку они вот пять раз менялись и ещё столько жэ раз сменятся.

Кстати, моё любимое обозначение чарсетов -- rfc2047.
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 11:11 pm
(Link)
вот когда glibc их будет понимать и уметь перекодировать без моего участия — так сразу. пока что я наблюдаю utf и юникод. судя по тому, что говна там немало — жить будет долго. а если начнёт подыхать — ещё говна досыпят.

разные кодировки — говноговноговно. поддерживать их — продлевать жизнь говну. выбрали одну — и идём, всё.
From:[info]tzirechnoy.livejournal.com
Date:November 20th, 2013 - 07:23 pm
(Link)
>вот когда glibc их будет понимать и уметь перекодировать без моего участия

Ну, три из них glibc -- понимает и перекодирует, если надо. Хотя я в упор не понимаю, как это -- перекодировать без участия.

>выбрали одну — и идём, всё.

И так пять раз. Смешно.
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 11:06 pm
(Link)
вот когда char станет размером в 32 бита и туда будет помещаться весь юникод — я с удовольствием выкину уёбищный utf. потому что он мне нравится так же, как чирей на жопе. особенно за охуенно удобное позиционирование в строке, для которого теперь надо ебошить аж целые функции вместо простых inc/dec/add/sub.
From:[info]max630.net
Date:November 18th, 2013 - 11:49 pm
(Link)
Позиционирования по символам/байтам/что-там-у-тебя нет, забудь про него, оно сдохло навсегда. Дaже в р́усском, а уж в каком-нибудь тайском и подавно.
From:[info]max630.net
Date:November 18th, 2013 - 11:50 pm
(Link)
о, промазал. ну идея явна
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 12:06 am
(Link)
я вот всегда считал, что компьютеры — это такая фигня, которая помогает решать проблемы людей. а в последнее десятилетие мне всё больше кажется, что люди — это такая фигня, которая призвана решать проблемы компьютеров.
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 12:08 am
(Link)
ну и да: отдельные диакритические знаки — это, конечно, охуенно придумано. ваще дико рад за авторов этой идеи: им в жизни нечего терять, потому что мозгов не было от рождения.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 12:33 pm
(Link)
Нормальный вариант. Плохо -- когда он единственный.
(и да, на Core Fonts он ложытся плохонько -- но... Есть варианты).
[User Picture]
From:[info]ketmar
Date:November 19th, 2013 - 03:50 pm
(Link)
угу, нормальный вариант — перемешивать буквы и управляющие знаки. не поддерживаю и не собираюсь.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 12:44 pm
(Link)
Да ладно. (УМВР. RL идёт ковать, весь RL в терминалах имитируется на уровне редакторо).
А так -- у каждого символа -- 0 1, 2, -1 знакоместа -- плюс возврат каретки и перевод строки. Всё, в общем, просто.
From:[info]tzirechnoy.livejournal.com
Date:November 19th, 2013 - 12:51 pm
(Link)
(посмотрев как сделано) да и RL можно сделать. Заполнять строку и рендэрить цэликом. На принтэрах работать небудет, ну и фиг с ними.
Правда, непонятно как правильно: половина терминалов плюёт на RL в юникоде, половина -- нет. Часть RL пользователей используют текстовые редакторы для эмуляцыи RL (ну, это я правда только у евреев видел, но с арабами я как-то вообще лично не встречался), часть хочет чтобы терминал умел RL (судя по воплям в багзиллы).
From:(Anonymous)
Date:November 18th, 2013 - 07:36 pm
(Link)
вот я хуй знает что там как в коде, но вот буквально неделю назад узнал как заставить fvwm показывать человеческие буквы. Надо в настройках шрифта ему на месте кодировки указать ... звёздочку. Не iso10646-1 – он тогда вообще нихуя не показывает, а именно *. Тогда нормалзно работает. Кодировка utf8
[User Picture]
From:[info]ketmar
Date:November 18th, 2013 - 08:01 pm
(Link)
кодировку руками вообще указывать не надо, от этого котята грустят.