Vitaliy ◀️TriΔng3l▶️
Dr. Friedrich
Вот в никсах вчар если не ошибаюсь 4 байта
Не ошибаешься. И поэтому L"привет" будет разной длины (в байтах) на разных платформах, например. Но (в идеале) должно выводиться одинаково корректно.
Vladislav
utf* отлично можно хранить в чарах
Vladislav
вне зависимости от плаформы
Ioann_
тогда все четко - и вообще мути никакой нету. Меня вот только одно всегда смущало - это плотность кодирования
Ioann_
Вот читаю я положим файл
Ioann_
Я не знаю какого он формата
Ioann_
кодирования
Dr. Friedrich
utf* отлично можно хранить в чарах
Можно. Одна из возможных стратегий — это внутри программы все строки хранить в UTF-8 (и сохранять в std::string, например). И конвертировать при передаче во внешние API (если это линукс — то либо ничего не делаешь, либо, если хочешь работать по всем правилам, то пробуешь конвертировать в текущую локаль; если это винда — то конвертируешь в UTF-16 перед отправкой в функции типа WriteConsoleW).
Ioann_
Вот как собсно быть в таких случаях - я лично сделал автоопределение кодировки, но оно естессно только для тех утф - в которых реально это распознать
Dr. Friedrich
Вот читаю я положим файл
Читай в UTF-8. Заставляй каждого, кто передал тебе файл в другой кодировке, страдать.
Dr. Friedrich
Он должен испытать невыносимые муки, мнятно?
Dr. Friedrich
И больше чтобы так не делал!
Dr. Friedrich
ага. с win просто - WriteConsoleA ascii/oem, WriteConsoleW ucs16 (aka utf16)
Вот ты написал предложение, и уже стало нифига не просто :) ASCII/OEM (а ещё ведь есть 65001), разница между UCS2 и UTF16 :)
Ioann_
Тогда такой вопрос, есть у меня ЮТФ 8 кодировочка в строке, и я ее хочу не вывести а нарисовать
Dr. Friedrich
Ну то есть WriteConsoleA — это ANSI, OEM или UTF-8. Поди догадайся.
Ioann_
Как узнать какой символ мне рисовать ?
Dr. Friedrich
Dr. Friedrich
Кстати!
Vladislav
по факту в винде нет utf16, ucs2 как сабсет
Ioann_
А как к нему обратиться ?
Ioann_
Я допустим рисую с помощью openGl
Dr. Friedrich
Как узнать какой символ мне рисовать ?
...кстати, шрифтовый рендер может знать не только про символы, но и про всякие лигатуры (когда несколько рядом стоящих символов рисуются как один).
Dr. Friedrich
А как к нему обратиться ?
Зависит от ОС, от DE, от используемого графического тулкита.
Dr. Friedrich
Если ты всё делаешь сам, то фигачь парсер шрифтового формата, и там как-нибудь векторно рисуй потом.
Ioann_
Аааа, эта инфа в шрифте хоронится
Dr. Friedrich
Но я бы никому тут не советовал таким заниматься, конечно.
Ioann_
тогда норма, да - все четко вобще
Ioann_
Ну опеджль не умеет в шрифты
Dr. Friedrich
Я рисую шрифты сам. И это невыносимые страдания.
Ioann_
и вулкан тоже как следствие
Vladislav
Ну то есть WriteConsoleA — это ANSI, OEM или UTF-8. Поди догадайся.
вообще. писали, что в win10 консоль стала шоколадной c нормальной поддержкой utf8+ и всеми делами. был бы colinux жив, можно было бы заюзать
Ioann_
Я рисую шрифты сам. И это невыносимые страдания.
А почему ? Там ведь просто кубические сплайны внутри
Dr. Friedrich
При том, что я ещё использую библиотечные шрифты и рендер, а сам только загоняю это в SVG.
Dr. Friedrich
А почему ? Там ведь просто кубические сплайны внутри
Делаю библиотеку для векторного рендеринга LaTeX-формул на одном оффтопном языке.
Ioann_
Невыносимые страдания это на вулкане настройку делать :) И потом вспоминать время от времени почему ты сделал так а не иначе. А все остальное, это чистая матеша. Теже шрифты - это просто простые сплайны, без самопересечений, кстати
Matwey
Расскажи.
Я точно не помню синегальский это был язык или нет, поэтому не буду обманывать.
Dr. Friedrich
вообще. писали, что в win10 консоль стала шоколадной c нормальной поддержкой utf8+ и всеми делами. был бы colinux жив, можно было бы заюзать
Я расскажу тебе. 1. Дефолтовая консоль осталась примерно в той же жопе, в какой была. Старые приложения, если они не работали, так и не заработают. 2. Добавили поддержку ANSI-кодов (можно каким-то флагом бинарника включить, вроде) — это работает. 3. В «Windows Subsystem for Linux», вроде как, работает UTF-8. Во всяком случае, я никаких существенных проблем не заметил. Эта подсистема пишет в ту же консоль, но реализация IO там сделана довольно хитро (что для пользовательского кода прозрачно).
Dr. Friedrich
ConEmu эту проблему решает. Во всяком случае, опять же, я давненько не встречал проблем.
Vladislav
вплане консоль ансовая vs u**
Ioann_
Хорошо, когда есть с кем поболтать по душенькам :)
Dr. Friedrich
«везде?»
Vladislav
нет
Ioann_
везде это не верно, т.к есть места где он может занимать и 8 бит
Dr. Friedrich
Я вот почти наверняка видал контроллеры, на которых это алиас для char.
Vladislav
w == wide
Ioann_
v == vendetta
Dr. Friedrich
http://icu-project.org/docs/papers/unicode_wchar_t.html > may be 8, 16, or 32 bits wide (on modern machines), signed or unsigned
Dr. Friedrich
Иногда 8 бит это уже шире, чем поддерживает твой character set :)
Dr. Friedrich
ок. например?
Говорю же, на контроллерах всяких может быть запросто.
Dr. Friedrich
Им нафиг не упало париться ещё и с юникодом и кодировками, и потому делают самый простой вариант кодирования.
Dr. Friedrich
Не понял вопрос.
Dr. Friedrich
Да, были платформы, на которых регистры были не восьмибитовыми, но как это относится к source character set?
Dr. Friedrich
Ты можешь задефайнить, что у тебя charset — это 7-битный ANSI. И тогда восьмой бит действительно будет запасным :)
Vladislav
на каких контроллерах char (не asm reg) может быть меньше 8 бит? мне любопытно
Vladislav
таких не знаю
Vladislav
charset != typeof char
Dr. Friedrich
На очень-очень старых. Там в древности были варианты и с 6, и с 9 битами, если не путаю.
Dr. Friedrich
На современных, скорее всего, такой дичи нет уже очень давно.
Vladislav
на них си было? если да, то что было с размером sizeof(char)
Dr. Friedrich
Ещё были какие-то платформы с 16-битными чарами.
Vladislav
больше может быть, ты говорил про меньше, нет?
Dr. Friedrich
Да, говорил.
Dr. Friedrich
есть даже с 64бит
Прям 64-битный char? Серьёзно?
Dr. Friedrich
на них си было? если да, то что было с размером sizeof(char)
Вон там конкретные примеры приводят: https://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char
Dr. Friedrich
На PDP-10 и каких-то мейнфреймах были 7- и 6-битные чары.
Dr. Friedrich
glibc имеет альтернативы даже в пределах Linux.
Dr. Friedrich
glibc — это ну вообще не «везде».