2014-09-09 4 views
1

Мне нужно отобразить LST ISO/IEC 8859-138 символы кодовой страницы на окне. В настоящее время я использую функцию ShowMessage для этой цели. Evrything отображается отлично, когда локали Windows из этого региона, но как иметь дело, когда у меня есть, например, английский английский UK? В этом случае у меня есть только «?» вместо символа. Должна быть какая-то возможность показывать региональные символы, поскольку MS Word отображает их без правильной локали. Но как это сделать?Отображать определенные региональные символы

+1

Просто используйте Unicode. Вы получаете встроенную поддержку в Delphi 2009+. –

ответ

2

У вас есть два жизнеспособные, послушные варианты:

  1. Обновление до версии Юникода Delphi, который имеет встроенную поддержку для международного текста или
  2. Используйте тротил Unicode управления, что трансплантат, которые поддерживают на пре- Unicode Delphi с использованием типа COM WideString, который кодируется с использованием Unicode.

У Word нет проблем, потому что он использует собственный Unicode API для Windows. С другой стороны, Delphi 7 использует ANSI API, который существует исключительно для обеспечения совместимости с Windows 95/98/ME.

0

В системе Windows можно установить несколько локалей. Если вы используете соответствующий языковой стандарт, то это локаль по умолчанию, и вы можете использовать диалог с текстовым полем, в котором используется правильный набор локалей/символов. В вашей системе разработки, где установлена ​​английская Великобритания, добавьте отсутствующие языки (языки).

Юникод лучше, но не требуется для отображения символов из символов, отличных от заданных по умолчанию (компьютеры смогли обработать множество наборов символов до того, как был изобретен Uincode). Даже MS Wordpad смог отображать символы из разных кодовых страниц, включая многобайтовые наборы символов (корейский, японский, китайский) задолго до того, как существовал Unicode.

ShowMessage нельзя использовать, поскольку он соответствует стандарту по умолчанию. Но его можно легко заменить специальной формой в стиле диалога.

+0

Под панелью управления-> Регион-> Административный-> Изменить локаль системы Я могу выбрать только одну локаль. Где я могу добавить других? Я использую Windows 8 – vico

+1

ShowMessage (в D7) использует шрифт системного сообщения. Как приложение может использовать набор символов, который он хочет? –

+0

@SertacAkyuz правильно, но я написал в своем ответе, что необходим диалог с текстовым полем (вместо ShowMessage, который придерживается стандартной локали) – mjn

1

Короткая версия:

вы также должны установить свойство Font.Charset, если вы хотите быть (более) уверен, что конкретный компонент будет отображать символы в данной кодировке.

Длинная версия (извините: я склонен к быть многословным)

Использование юникода (и вы должны перейти к версии Юникода Дельфы, если вы еще не сделали этого) не гарантирует, что установлены шрифты на чужом ПК будет содержать все символы, которые вы хотите отобразить. Использование unicode, кроме того, не делает ничего, чтобы заставить операционную систему выбрать шрифт, который действительно поддерживает кодировку, в которой вы нуждаетесь: даже если есть установленный шрифт, способный отображать кириллические символы, окна НЕ выбирают этот шрифт только потому, что вы спрашиваете его для отображения строки, содержащей кодовые точки кириллического юникода: она все равно будет использовать системные шрифты по умолчанию.

Итак: всегда существует вероятность, что вам нужно будет попросить ваших клиентов установить шрифт, поддерживающий кодировку, требуемую вашим приложением. если это может быть серьезной проблемой, вы должны рассмотреть идею распространения необходимых шрифтов вместе с вашими двоичными файлами (будьте осторожны с копирайтами шрифтов). На втором месте: если в приложении есть компоненты, вы уверены, что они всегда будут показывать русский текст, ну, в таких компонентах вы ДОЛЖНЫ назначить Font.Charset = RUSSIAN_CHARSET.Это способ отображения окон «Мне действительно нужно отображать кириллические символы в этом компоненте, поэтому выберите подходящий шрифт, безразличный, с какой стороны планеты вы работаете»

Это распространенное заблуждение, что свойство che charset является бесполезно с программами unicode. все наоборот.

Другая распространенная ошибка заключается в том, чтобы предположить, что шрифт «XYZ» идентичен во всех установках Windows в мире, поэтому, если я могу видеть кириллические символы с Thamoa на моем компьютере, то я безопасно использовать Thamoa для отображения кириллицы в остальной мир. это совсем наоборот: другой юникодный подмножество устанавливается в зависимости от локали компьютера.

и ... Поскольку AFAIK ShowMessage() использует стандартный по умолчанию шрифт, вы не можете использовать эту процедуру для отображения сообщений, содержащих «странные» символы: вам нужно написать собственное диалоговое окно ShowMessage.

EDIT: вот пример демонстрирует, что я говорю

просто уронить компонент TPaintBox на форме, назовите его «PBOX», и написать этот OnPaint обработчик события: (помните, чтобы сохранить источник в кодировке -8 формат, иначе русские символы будут подогнаны)

procedure TForm1.pboxPaint(Sender: TObject); 
begin 
    pbox.canvas.Font.Name := 'Fixedsys'; 
    pbox.Canvas.TextOut(0,0,'Это русский'); 

    pbox.canvas.Font.Name := 'Fixedsys'; 
    pbox.canvas.Font.Charset := RUSSIAN_CHARSET; 
    pbox.Canvas.TextOut(0,20,'Это русский'); 
end; 

на итальянском компьютере (и я предполагаю, что на любом западно-европейском или американском ПК) шрифт Fixedsys обычно не содержит русский символы символов: первый TextOut будет настаивать на использовании шрифта FixedSys и напишет мусор. Например, на моем компьютере я получаю последовательность черных квадратов.

Второй текст сделан после установки charset = RUSSIAN_CHARSET, поэтому окна будут знать, что нам нужны русские символы и поэтому выбирает другой шрифт. Второй TextOut не использует шрифт FixedSys, который я хотел использовать, но, по крайней мере, он читаем!

В русской установке окон оба вызова TextOut корректно отображают русский текст с использованием шрифта FixedSys, поскольку русские установки окон имеют русскую версию шрифта fixedsys. и Windows это знает.