?

Log in

No account? Create an account
 
 
03 Февраль 2010 @ 15:25
Кракозябры и знаки вопроса или неверная кодировка  
Да-да. Как это ни печально, в эру UNICODE у меня снова встал
вопрос с кракозябрами или знаками вопроса вместо русских букв.

Обнаружилось, что все мои программы с русскоязычным интерфейсрм, написанные на Delphi 7, при отображении их в англоязычных операционных системах вместо русских букв отображают знаки вопроса. Скажу сразу, перевод проектов под UNICODE-совместимую версию Дельфи (2009 или 2010) практически не представляется возможным, поскольку в этих проектах использованы компоненты, не имеющие новых UNICODE-совместимых версий (поддержка компонентов авторами больше не осуществляется).

Странно не то, что интерфейс программ не отображает русских букв, а то, что вместо ожидаемых кракозябр отображаются знаки вопроса. Кракозябры - это не что иное, как символы текущей кодировки, имеющие коды, совпадающие с кодами русских букв в русской кодировке, и их появление вполне ожидаемо. Знаки вопроса же обычно возникают в том случае, когда система не может сопоставить использованный национальный символ UNICODE (например, русскую букву из UNICODE) с символом текущей кодировки (например, 1252, где похожих символов просто нет). Но у меня Юникодом и не пахнет нигде, у меня в интерфейсе изначально идёт кодировка 1251, которая в англоязычной кодировке 1252 должна отображаться кракозябрами! Очевидно, где-то в операционной системе происходит двойное преобразование по цепочке 1251 - UNICODE - 1252.

Операционная система Windows XP, Windows Vista и Windows 7 имеют специальную настройку локалей. Располагается она на Панели Управления, и называется "Язык и национальные стандарты". Там, на последней вкладке (вкладка "Дополнительно") можно выбрать язык для программ, не поддерживающих Юникод. По идее, после установки там русского языка, программа должна отображать русские буквы правильно. На деле же происходит отображение русских букв только в шапке программы и в компонентах ColorBox. Во всех остальных компонентах интерфейса остаются знаки вопроса.

Удивительно, но проблему решает совершенно другая настройка, а именно "Региональные параметры" (первая вкладка окна "Язык и региональные параметры"). Вообще-то эта вкладка отвечает за форматы выводимых чисел, денежных единиц, даты и времени, и какое отношение она имеет к кодировкам - непонятно. Тем не менее, если установить на ней значение "Русский (Россия)", знаки вопроса пропадают, и система начинает вести себя так, как положено, то есть интерфейс программы начинает отображать либо кракозябры, либо русские буквы в зависимости от настройки локали на вкладке "Дополнительно".

Вот такие результаты дают разные комбинации этих двух настроек в любой версии операционной системе Windows, начиная с версии Windows XP:

Формат: США
Локаль: США
Результат: Везде знаки вопроса
 
Формат: США
Локаль: Россия
Результат: Везде знаки вопроса, кроме шапки и колорбоксов, в которых отображаются русские символы
 
Формат: Россия
Локаль: США
Результат: Везде "кракозябры"
 
Формат: Россия
Локаль: Россия
Результат: Всё ОК!

Резюмируя вышесказанное, формулирую следующие непонятные мне вопросы:
  1. Почему на англоязычных компьютерах в интерфейсе русскоязычных программ, использующих однобайтовую кодировку, вместо кракозябр возникают знаки вопроса? Появляются ли они из-за возникновения цепочки преобразований 1251 - UNICODE - 1252, и если да, то почему, и как этого избежать?
  2. Почему при переключении локали на последней вкладке, знаки вопроса превращаются в русские символы только в шапке программы и в компоненте ColorBox? В чём разница между этими и всеми остальным компонентами?
  3. Почему на появление знаков вопроса влияет первая вкладка, отвечающая за формат выводимых чисел и дат? Можно ли решить вопрос, оставив формат отображения чисел и дат англоязычным, без нудной подгонки русского формата под англоязычный в дополнительных настройках?
Повторюсь, что вышеописанное касается всех версий Windows, начиная с версии Windows XP. Это наводит на мысль, что операционные системы работают правильно, и я просто чего-то недогоняю.


P.S.: Я выявил все форматы, при которых кириллица отображается нормально:

Азербайджанский (кириллица)
Амхарский (Эфиопия)
Армянский (Армения)
Ассамский (Индия)
Башкирский (Россия)
Белорусский (Беларусь)
Бенгальский (Бангладеш)
Бенгальский (Индия)
Болгарский (Болгария)
Боснийский (кириллица)
Грузинский (Грузия)
Гуджарати (Индия)
Дивихай (Мальдивы)
Инуктитут (слоговое письмо, Канада)
Казахский (Казахстан)
Каннада (Индия)
Киргизский (Киргизстан)
Конкани (Индия)
Кхмерский (Комбоджа)
Лаосский (ЛНДР)
Македонский (БЮР Македония)
Малаялам (Индия)
Мальтийский (Мальта)
Маори (Новая Зеландия)
Маратхи (Индия)
Монгольский (традиционный монгольский, КНР)
Монгольский (кириллица, Монголия)
Непальский (Непал)
Ория (Индия)
Панджаби (Индия)
Пашто (Афганистан)
Русский (Россия)
Санскрит (Индия)
Сербский (кириллица)
Сингальский (Шри-Ланка)
Сирийский (Сирия)
Таджикский (кириллица, Таджикистан)
Тамильский (Индия)
Татарский (Россия)
Телугу (Индия)
Тибетский (КНР)
Узбекский (кириллица, Узбекистан)
Украинский (Украина)
Хинди (Индия)
Юи (КНР)
Якутский (Россия)

Во всех остальных форматах, коих намного больше, возникают знаки вопроса. Отсюда дополнительный вопрос, что общего с точки зрения настроек операционной системы между всеми этими языками?


Кстати, 4 формата дали ещё один интересный результат:

Китайский (упрощённое письмо, КНР) и Китайский (упрощённое письмо, Сингапур) дали знаки параграфа §, чередующиеся с символами кириллицы.
Корейский (Корея) дал знаки ¬ чередующиеся с символами кириллицы.
Японский (Япония) дали знаки ˷ чередующиеся с символами кириллицы.

Так что вот дополнительная пища для размышлений.
 
 
 
uri_uriuri_uri on Февраль, 3, 2010 13:29 (UTC)
ru_typography
Я перепостил в ru_typography
http://uri-uri.livejournal.com/5075.html

Если там не объяснят причину, то только в блог Микромягких писать.
(Удалённый комментарий)
Re: ru_typography - uri_uri on Февраль, 3, 2010 16:41 (UTC) (Развернуть)
(Удалённый комментарий)
Re: ru_typography - uri_uri on Февраль, 3, 2010 17:00 (UTC) (Развернуть)
Re: ru_typography - novikovmaxim on Февраль, 3, 2010 17:03 (UTC) (Развернуть)
Re: ru_typography - novikovmaxim on Февраль, 3, 2010 16:56 (UTC) (Развернуть)
<wj4hayk on Февраль, 3, 2010 16:55 (UTC)
В Windows XP, в третьей вкладке региональных настроек можно выбрать язык для неюникодных программ. У вас там какой?
Максим Новиковnovikovmaxim on Февраль, 3, 2010 16:58 (UTC)
Русский. Я об этом писал в четвёртом абзаце.
Без темы - hayk on Февраль, 3, 2010 17:10 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 3, 2010 17:15 (UTC) (Развернуть)
Без темы - uri_uri on Февраль, 3, 2010 17:23 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 3, 2010 17:25 (UTC) (Развернуть)
Без темы - hayk on Февраль, 3, 2010 17:28 (UTC) (Развернуть)
Без темы - uri_uri on Февраль, 3, 2010 17:31 (UTC) (Развернуть)
uri_uriuri_uri on Февраль, 3, 2010 17:35 (UTC)
Проблема не в шрифтовом движке Windows
Вот тут Максим Жуков отписался и скриншот выложил: http://community.livejournal.com/ru_typography/699076.html?thread=8211140#t8211396
У него MAC. Так что дело скорее всего не в винде, а в формате шрифта.
Максим Новиковnovikovmaxim on Февраль, 3, 2010 17:42 (UTC)
Re: Проблема не в шрифтовом движке Windows
Я уже думал про шрифты; получается первая вкладка с настройками формата чисел и дат также фоново выбирает шрифт? Интересно, можно ли на этот выбор повлиять?
4thfebruary on Февраль, 3, 2010 17:40 (UTC)
Вам сюда http://www.microsoft.com/globaldev/tools/apploc.mspx , коллега :)
Максим Новиковnovikovmaxim on Февраль, 3, 2010 17:52 (UTC)
Спасибо, интересно, надо попробовать. Правда утилита 2003 года и разработана в для XP. Но, может, заработает в семёрке.

Что примечательно, в тексте описания тоже упоминается только вкладка локали, и, насколько я понял, не слова про вкладку формата.
Без темы - 4thfebruary on Февраль, 3, 2010 18:01 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 3, 2010 19:23 (UTC) (Развернуть)
Без темы - 4thfebruary on Февраль, 3, 2010 19:40 (UTC) (Развернуть)
4thfebruary on Февраль, 3, 2010 19:49 (UTC)
А что у Вас выставлено в свойствах формы Font.Charset ? DEFAULT_CHARSET? А если попробовать выставить RUSSIAN_CHARSET?
Максим Новиковnovikovmaxim on Февраль, 3, 2010 20:25 (UTC)
Попробовал (и в форме, и в лейблах) - результат без изменений.

Но... если поставить формат чисел и дат (на первой вкладке) в США, а в Дельфи произвести любое изменение формы и перекомпилировать, то русский интерфейс начинает прекрасно отображаться, но до тех пор, пока не переключу формат чисел и дат снова в Русский. Тогда в интерфейсе появляются хоть не знаки вопроса, но кракозябры, но уже не похожие на кракозябры кодировки 1252.

Вот такая вот петрушка...
ティエリア・アーデdark_general on Февраль, 5, 2010 18:01 (UTC)
"Это наводит на мысль, что операционные системы работают правильно, и я просто чего-то недогоняю."

Вы недогоняете того что дельфи не умеет поддерживать юникод. Проблемы негров как известно.
Максим Новиковnovikovmaxim on Февраль, 5, 2010 18:27 (UTC)
Вы, наверное, не очень внимательно прочитали мой пост.
Без темы - dark_general on Февраль, 5, 2010 22:52 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 6, 2010 11:06 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 6, 2010 13:53 (UTC) (Развернуть)
Без темы - (Анонимно) on Февраль, 11, 2010 10:06 (UTC) (Развернуть)
Без темы - novikovmaxim on Февраль, 11, 2010 10:21 (UTC) (Развернуть)
sevonkasevonka on Март, 6, 2010 03:26 (UTC)
1. "working simultaneously with both types of Cyrillic texts - texts that use Unicode and those that do not use Unicode - often leads (under a non-Russian Windows) to the unreadable, gibberish texts or just a set of question marks instead of Cyrillic letters."

2. http://www.joelonsoftware.com/articles/Unicode.html

прямо на вопрос не отвечает, но может прояснит тему немного
Максим Новиковnovikovmaxim on Март, 6, 2010 11:48 (UTC)
Спасибо за ссылку. К сожалению, английским владею на три с минусом, но попробую выделить время и изучить материал. Вопрос то знакомый, но надо не пропустить нюансы. Спасибо ещё раз! :)
Без темы - sevonka on Март, 6, 2010 22:33 (UTC) (Развернуть)
(Анонимно) on Июнь, 28, 2010 10:30 (UTC)
спасибо
Макс, спасибо что поделился опытом, ты сэкономил мне кучу времени!
Еще раз, огромное спасибо )))
Максим Новиковnovikovmaxim on Июнь, 28, 2010 10:39 (UTC)
Re: спасибо
Пожалуйста! :)
(Анонимно) on Июль, 1, 2010 15:10 (UTC)
спасибо
Спасибо, час сидел и читал про то как менять нонюникоде язык в настройке, как править реестр и прочие ничем не помогающие действия, пока не нашел этот "очерк" ) действительно, смена языка на русский в региональных настройках решила вопрос
Максим Новиковnovikovmaxim on Июль, 2, 2010 08:54 (UTC)
Re: спасибо
Пожалуйста! :)
Вопрос то решается, но как-то не очень логично всё это. Узнать бы причины...
Пока никто вразумительного объяснения предложить не смог. :(
Re: спасибо - Павел Скуратович on Октябрь, 20, 2011 07:47 (UTC) (Развернуть)
Re: спасибо - novikovmaxim on Октябрь, 20, 2011 09:23 (UTC) (Развернуть)
Re: спасибо - Павел Скуратович on Октябрь, 20, 2011 11:17 (UTC) (Развернуть)
Re: спасибо - novikovmaxim on Октябрь, 20, 2011 11:24 (UTC) (Развернуть)
Re: спасибо - Павел Скуратович on Октябрь, 20, 2011 11:39 (UTC) (Развернуть)
Re: спасибо - novikovmaxim on Октябрь, 20, 2011 11:42 (UTC) (Развернуть)
Re: спасибо - Павел Скуратович on Октябрь, 20, 2011 12:10 (UTC) (Развернуть)
Re: спасибо - novikovmaxim on Октябрь, 20, 2011 12:12 (UTC) (Развернуть)
Без темы - Павел Скуратович on Октябрь, 20, 2011 12:18 (UTC) (Развернуть)
Без темы - novikovmaxim on Октябрь, 20, 2011 12:27 (UTC) (Развернуть)
Re: спасибо - novikovmaxim on Октябрь, 20, 2011 11:53 (UTC) (Развернуть)
ivan_ljivan_lj on Октябрь, 8, 2010 13:20 (UTC)
> Вообще-то эта вкладка отвечает за форматы выводимых чисел, денежных единиц, даты и времени, и какое отношение она имеет к кодировкам - непонятно

действительно странно. значит винда как обычно прогналась. тоже столкнулся с этим, как только перенастроил кое-что в "Язык и региональные стандарты", в том числе и текущий формат. могу сказать только, что русский текст *.pas хранится однобайтово в вин1251, и потому видится в редакторе нормально, а файлы форм, *.dfm, имеют русские символы в виде #1052, которые почему-то становятся вопросами
Максим Новиковnovikovmaxim on Октябрь, 8, 2010 14:20 (UTC)
Ага, спасибо, это уже что-то.
Без темы - (Анонимно) on Октябрь, 21, 2011 14:35 (UTC) (Развернуть)
теперь только Кейт...(: кискаkate_baks on Октябрь, 22, 2010 14:24 (UTC)
спасибо, помогло за 5 секунд! а то на всех форумах только совету переустановить винду..
Максим Новиковnovikovmaxim on Октябрь, 22, 2010 16:41 (UTC)
Пожалуйста! :)
(Анонимно) on Июнь, 14, 2011 15:13 (UTC)
Работает
"Региональные параметры" (первая вкладка окна "Язык и региональные параметры")- да действительно помогло все перерыл ничего не помогало, видел этот пункт но даже не мог себе представить что поможет то даже и не пытался, спасибо за наводку автору респект!
gremlinablegremlinable on Август, 24, 2011 17:09 (UTC)
Забавно!
Очень интересное шаманство. Сейчас попалась софтина, собранная на чистом CP1251 и показывающая всё вопросиками. Так вот - и локаль и формат давно и везде выставлены в русский (да, Win7ProEn). Помогло выставить формат в USA, применить и потом выставить обратно...
(Анонимно) on Сентябрь, 9, 2011 12:04 (UTC)
Да, мне на Win 7 Pro Eng помогло лекарство от gremlinable - сбросить поле Format в English (United Sates) и обратно в Russian (Russia) в Control Panel\Clock, Language, and Region\Region and Language\Formats
Без темы - (Анонимно) on Ноябрь, 11, 2011 02:56 (UTC) (Развернуть)
Без темы - (Анонимно) on Сентябрь, 12, 2011 09:34 (UTC) (Развернуть)
Без темы - (Анонимно) on Сентябрь, 12, 2011 09:38 (UTC) (Развернуть)