как узнать (в коде), что некоторые символы отображаются нормально (или нет) в интерфейсе программы, созданной на Delphi - PullRequest
1 голос
/ 09 апреля 2011

Извините за мой английский ...

Я пытаюсь сделать небольшую программу в Delphi 7. Его интерфейс будет иметь текст на моем языке, в котором есть некоторые символы с диакритическими знаками. Если «Язык для программ, не поддерживающих Юникод» установлен на мой язык, эти символы всегда отображаются нормально. Это нормально. Если установлено что-то другое, иногда отображаются нормально, иногда нет. Как я могу знать, что они могут отображаться нормально или нет ...? О, и я не могу использовать компоненты Unicode, только нормально.

Единственный способ, который я нашел, - захватить изображение из одного символа в растровое изображение и проверить пиксель за пикселем. Но это много работы для реализации, медленно и неточно.

Я могу использовать функцию GetSystemDefaultLangID и знать, что «Язык для программ, не поддерживающих Юникод» установлен на что-то другое, но все еще не знаю, нормально ли они отображаются.

Спасибо за любую идею.

Ответы [ 4 ]

2 голосов
/ 09 апреля 2011

Добро пожаловать в радости AnsiStrings, закодированные с использованием кодовых страниц. Вы не должны использовать AnsiStrings вообще, и вы это знаете, но вы говорите, не объясняя этого, что вы не можете использовать элементы управления Unicode. это кажется странным для меня. Вы должны использовать либо:

(a) Версия Delphi для Unicode (2009,2010, XE), где String = UnicodeString.

(b) Если это не так, по крайней мере, используйте надлежащие элементы управления Unicode, такие как элементы управления TNT, и внутренне используйте типы WideString, где вам нужно хранить акцентированные или международные символы.

Ваша версия Delphi имеет String = AnsiString, и вы полагаетесь на локаль, на которую настроена ваша система (как вы говорите в своем вопросе), чтобы выбрать представления кодовых страниц с акцентированными символами, что является проблематичной схемой. Если вы действительно не можете перейти от Delphi 7, по крайней мере, начать использовать WideStrings и элементы управления Unicode TNT, но я должен сказать, что усилия затрачены, вам лучше получить Delphi XE и просто портировать на Unicode.

Ваш вопрос спрашивает "как я могу знать, могут ли они храниться в порядке или нет?" Вы можете кодировать и декодировать, используя вашу кодовую страницу, и проверить, заменено ли что-либо символом «?». Например, функция Windows WideCharToMultiByte ведет себя так. MBCS - это мир боли, и делать его не стоит, но вы спросили, как вы можете узнать, где выпадает слово из-под вас, чтобы API помог вам понять выбранное вами правило кодирования.

1 голос
/ 09 апреля 2011

Используйте функцию WideCharToMultiByte - http://msdn.microsoft.com/en-us/library/dd374130(v=vs.85).aspx и проверьте параметр lpUsedDefaultChar.

0 голосов
/ 09 апреля 2011

Так как это было в моем списке исследований некоторое время, но еще не достигло вершины этого списка, я могу помочь вам только с несколькими ссылками.

Вам нужно будет довольноНемного экспериментов: -)

При использовании Unicode вы можете использовать функции ScriptGetCMap и GetGlyphIndices , чтобы проверить, находится ли кодовая точка в шрифте.Когда Unicode не используется, вы можете использовать функцию GetGlyphIndices

. Существует несколько переводов Delphi этих функций. Эта ветка группы новостей Borland содержит несколько советов по использованию GetGlyphIndices в Delphi .Вот поиск ScriptGetCMap в Delphi .

Эта страница содержит список некоторых интересных вызовов API, которые могут помочь вам в дальнейшем.

Дополнительная информацияНедостаток в том, что не все шрифты содержат все символы, поэтому Windows может сделать замену шрифта за вас.
Я не уверен, как это выяснить, но это тоже нужно проверить.

Удачи: -)

0 голосов
/ 09 апреля 2011
procedure TForm1.Button2Click(Sender: TObject);
var
    ACP: Integer;
begin
    ACP := GetACP;
    Caption := 'CP' + IntToStr(ACP);
    if ACP = 1250 then
        Caption := Caption + ' is okay for Romanian language';
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...