1. Как такое вообще возможно?
2. Как это починить?
Половина слов в UTF8, половина в какой-нибудь UTF16/32 или вообще cp1251? Мне казалось, что если данные закодированы в unicode, то либо строка является допустимой, либо недопустимой, и тогда от рендера шрифтов должно прийти сообщение об ошибке (либо рендер заменит символы на знаки вопросов как в Java).
Здравствуйте, cppguard, Вы писали:
C>А почему половина слов нормально отображается? Сейчас уже решил проблему добавлением LC_ALL=ru_RU.UTF-8.
Потому что одна половина идет через DrawTextA(), а вторая — через DrawTextW().
Здравствуйте, Marty, Вы писали:
M> R>У шрифта не указан/указан неправильный чарсет.
M> Вот кстати, а нафига оно нужно в мире юникода? Или это пережитки тяжелого Ansi прошлого?
Если я правильно помню, это нужно для того, чтобы система могла правильно выбрать физический файл шрифта с нужными глифами.
Здравствуйте, rudzuk, Вы писали:
M>> R>У шрифта не указан/указан неправильный чарсет.
M>> Вот кстати, а нафига оно нужно в мире юникода? Или это пережитки тяжелого Ansi прошлого?
R>Если я правильно помню, это нужно для того, чтобы система могла правильно выбрать физический файл шрифта с нужными глифами.
Ну если у меня юникодные строки на кириллице, то пусть фонт маппер сам и думает, как ему русские буквы отображать, почему я ещё должен при создании шрифта чарсет задавать? Тем более, что я им собираюсь не только кириллицу выводить. Или, задача выводить кириллицу/латинницу/арабицу/etc так до сих пор и лежит на программисте? И для каждой буквы надо самому решать, какой шрифт использовать для её отображения?
Это у тебя ещё приемлемо выглядит.
Я однажды запустил приложение налоговой на английской винде, и увидел три варианта отображения русского текста на одной форме: нормальные символы, кракозябры, вопросики.
Здравствуйте, Marty, Вы писали:
M> R>Если я правильно помню, это нужно для того, чтобы система могла правильно выбрать физический файл шрифта с нужными глифами.
M> Ну если у меня юникодные строки на кириллице, то пусть фонт маппер сам и думает, как ему русские буквы отображать, почему я ещё должен при создании шрифта чарсет задавать?
Потому что связывание логического шрифта с физическим происходит в момент назначения шрифта на контексте устройства. И именно в этот момент система должна иметь достаточно информации для выбора правильного физического шрифта.
M> Тем более, что я им собираюсь не только кириллицу выводить. Или, задача выводить кириллицу/латинницу/арабицу/etc так до сих пор и лежит на программисте? И для каждой буквы надо самому решать, какой шрифт использовать для её отображения?
Сейчас все несколько проще т.к. шрифты поддерживают чуть не весь юникод (по крайней мере стремяться). Но вообще, шрифты могут иметь ограниченный набор глифов и если использовать неправильный чарсет и при этом указать гарнитуру именно такого шрифта, то увидишь только квадратики.
Здравствуйте, rudzuk, Вы писали:
M>> Ну если у меня юникодные строки на кириллице, то пусть фонт маппер сам и думает, как ему русские буквы отображать, почему я ещё должен при создании шрифта чарсет задавать?
R>Потому что связывание логического шрифта с физическим происходит в момент назначения шрифта на контексте устройства. И именно в этот момент система должна иметь достаточно информации для выбора правильного физического шрифта.
Вроде бы фонт маппер для каждого символа ищет глиф или как оно зовется. Читал что-то такое. Но могу ошибаться
R>Сейчас все несколько проще т.к. шрифты поддерживают чуть не весь юникод (по крайней мере стремяться). Но вообще, шрифты могут иметь ограниченный набор глифов и если использовать неправильный чарсет и при этом указать гарнитуру именно такого шрифта, то увидишь только квадратики.
Получается, нужно каждый символ проверять, к какому чарсету он относится и рисовать отдельно соответствующим шрифтом, чтобы всё было всегда хорошо?
Здравствуйте, Marty, Вы писали:
M> R>Потому что связывание логического шрифта с физическим происходит в момент назначения шрифта на контексте устройства. И именно в этот момент система должна иметь достаточно информации для выбора правильного физического шрифта.
M> Вроде бы фонт маппер для каждого символа ищет глиф или как оно зовется. Читал что-то такое. Но могу ошибаться
Когда физический шрифт уже сопоставлен с логическим, то там только cmap (таблица из файла шрифта с индексами глифов) юникодовский используется, насколько я помню.
M> R>Сейчас все несколько проще т.к. шрифты поддерживают чуть не весь юникод (по крайней мере стремяться). Но вообще, шрифты могут иметь ограниченный набор глифов и если использовать неправильный чарсет и при этом указать гарнитуру именно такого шрифта, то увидишь только квадратики.
M> Получается, нужно каждый символ проверять, к какому чарсету он относится и рисовать отдельно соответствующим шрифтом, чтобы всё было всегда хорошо?
Или использовать гарнтитуру с полным покрытием юникода