Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизПроблемы с кодировкой Найти похожие ветки
← →
juice © (2006-12-01 16:14) [0]Я задавал тут этот вопрос но ответа так и не получил, ветка куда-то пропала. Проблема следующая:
при запуске моей программы на других машинах где на панели управления, Язык и региональные стандарты, Региональные параметры, Языковые стандарты и форматы установлено в "Английский(США)" вместо надписей выводятся вопросительные знаки. При смене этого параметра на "Русский" все становиться нормально. Мне тут советовали поставить "Русский" в "Язык программ, не поддерживающих Юникод" - так он там и стоит. Да и вообще, по логике вещей проблема должна быть в моей программе а не в настройках системы, ведь другие программы с латинскими символами отображаются нормально. Ничего особенного в моей прожекте тоже нет - попробовал создал новый проект, положил на форму стандартный лейбл - все те же знаки вопроса.
← →
Dmitrij_K (2006-12-01 16:21) [1]SetThreadLocale пробывал?
← →
Juice © (2006-12-01 16:43) [2]GetThreadLocale и там и там выдает 1033, значит не в этом проблема.
← →
Германн © (2006-12-01 16:53) [3]
> juice © (01.12.06 16:14)
RUSSIAN_CHARSET у фонта стоИт?
← →
Juice © (2006-12-01 17:28) [4]
> RUSSIAN_CHARSET у фонта стоИт?
Да
← →
Loginov Dmitry © (2006-12-02 12:49) [5]А шрифты стандартные? (Штифт: MS Sans Serif. Размеры: 10, 12, 14, 18. Стиль: обычный)
← →
Juice © (2006-12-04 11:16) [6]Да :
object Label1: TLabel
Left = 160
Top = 120
Width = 35
Height = 13
Caption = "привет"
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
ParentFont = False
end
← →
Anatoly Podgoretsky © (2006-12-04 11:22) [7]> Juice (04.12.2006 11:16:06) [6]
Замени "MS Sans Serif" на Юникод шрифт
← →
Max Zyuzin © (2006-12-04 11:48) [8]>juice © (01.12.06 16:14)
Вопрос такой а у вас что стоит в Control Panel -> Regional and Language Options -> Anvanced -> Language for non-Unicode programs?
← →
Juice © (2006-12-04 12:09) [9]
> Замени "MS Sans Serif" на Юникод шрифт
Не помогает
> Вопрос такой а у вас что стоит в Control Panel -> Regional
> and Language Options -> Anvanced -> Language for non-Unicode
> programs?
"Русский"
← →
Juice © (2006-12-04 12:28) [10]Слудующий эксперимент прошел успешно:
SET
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252 = с_1251, и перезагрузиться.
Только как мне теперь это использовать ? Менять этот пераметр перед первым запуском программы не есть хорошо, как заставить саму программу работать правильно ? Помогите разобраться, просто я вообще не улавливаю сути операции замены 1252(чего это номер?) на 1251
← →
Anatoly Podgoretsky © (2006-12-04 12:36) [11]> Juice (04.12.2006 12:28:10) [10]
Если боишься потерять свое рабочее место, то никому про это не говори.
← →
Juice © (2006-12-04 13:04) [12]
> Anatoly Podgoretsky © (04.12.06 12:36) [11]
Ну тогда обьясните почему программа на машине где стоит английская локаль пытается взять 1252 кодовую страницу а на машине с русской 1251 ?
В настройках проекта стоит Language, LocaleId = $0419(Русский), в справке написано следующее :
The Language indicates which Code Page the users system will require to run the application, that is, it indicates which language the application displays. Choose the desired language from the drop-down list. The hex value of the selected locale appears above the drop-down box.
Note: You can only choose a language that is listed in the Control Panel Regional Settings dialog of your computer. Some versions of the Windows operating system do not include support for all languages (such as Far Eastern languages), and you may need to install the appropriate Language Pack before you can use those languages.
← →
Anatoly Podgoretsky © (2006-12-04 13:53) [13]> Juice (04.12.2006 13:04:12) [12]
> Ну тогда обьясните почему программа на машине где стоит английская локаль пытается взять 1252 кодовую страницу а на машине с русской 1251 ?
А чего тут объяснять, неверно написаная программа.
← →
Juice © (2006-12-04 14:17) [14]
> А чего тут объяснять, неверно написаная программа
Ошибаетесь, программа таковой быть не может т.к. не содержит ни единой строчки кода :
File -> New -> Application, Drag&Drop TLabel, Label1.Caption = "тест". Все. Попробуйте сами, D7.
← →
Anatoly Podgoretsky © (2006-12-04 15:09) [15]> Juice (04.12.2006 14:17:14) [14]
На слабо берешь?
Продолжай и много тебе это поможет?
← →
Juice © (2006-12-04 15:45) [16]
> Anatoly Podgoretsky © (04.12.06 15:09) [15]
Не понял.
← →
Juice © (2006-12-04 17:50) [17]Вот еще наблюдение -
procedure TForm1.FormCreate(Sender: TObject);
begin
Label2.Caption := "тест";
end;
Срабатывает правильно. Т.е. присвоение в рантайме работает а контролы у которых текст установлен в designtime отображают "??????"
← →
Juice © (2006-12-04 18:50) [18]И еще наблюдение :
если переключить на машине где билдится проект локаль на английскую, открыть в делфи проект - увидим на формах вместо всех компонентов знаки вопросов. Теперь заново переопределив надписи (напр. кэпшены для TLabel) и сделав билд приложение будет нормально себя показывать на других машинах с английской локалью ! Казалось бы проблема решена, но ... Теперь глюки вместо текста при запуске приложения на машинах где стоит английская локаль ! :) Подчеркиваю еще раз - проблема только с текстом который установлен свойствам компонентов в designtime, когда идет присвоение через код (label1.Caption="тест") все нормально. Кстати, аналогичное VCL-приложение созданное при помощи борланд студии отобраает текст нормально под всеми локалями. Наверное причина в самой Delphi 7 или ее настройках, только каких ?
← →
Juice © (2006-12-05 11:06) [19]Кто-то может обьяснить что нужно сделать чтобы приложение можно было запускать на машинах с разными локалями и не возникало проблем с отображением текстовых данных что хранятся в ресурсах?
← →
Juice © (2006-12-05 12:33) [20]Может перенести ветку обратно в "Основная" ?
← →
Barloggg (2006-12-05 16:44) [21]это разные винды.
дома ХР, на работе 98.
под 98 на кнопочках на форме писал по русски.
Пришел домой под ХР, чего-то дописал, скомпилил, принес на работу: и тут сабж!
что называется подкрался... и в исходниках тоже самое. а дома я плотно поработал.
я так понял что под ХР Дельфи (энтерпризе) русский шрифт обрабатывает как юникод, а под 98 Дельфи (триал) как ASCII.
Я малость прибалдел и переписал все кнопки на английском, а в onCreate ручками сделал переименование.
Дорого, конечно, но зато как сердито!
← →
Barloggg (2006-12-05 16:46) [22]точнее гоню. скомпиленный дома вариант везде выглядит нормально, а открытые и перекомпиленные сырцы на работе уже с вопросительными знаками. вот так-то.
← →
Juice © (2006-12-05 17:17) [23]Я вообще уже не знаю что делать, ну что тут еще можно сказать ?
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := "тест";
Label2.Caption := "ANSI code-page = " + IntToStr(GetACP);
Label3.Caption := "OEM code-page = " + IntToStr(GetOEMCP);
end;
При тестировании приложения на обеих машинах на экране видим :
Label1 = тест
Label2 = ANSI code-page = 1251
Label3 = OEM code-page = 866
... что свидетельствует о том, что язык программ не использующих Юникод на обеих машинах выставлен одинаково и все должно быть ОК ! Но почему только строки которые хранятся в ресурсах отображаются неправильно ? И почему подмена параметра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252 на 1251 решает проблему?
Я вижу только одну причину - RTL Delphi какого-то черта оперируя с ресурсами определяет кодовую страницу согласно языковым стандартам и форматам а не кодовой странице установленной в системе. Почему ??????? А главное как изменить такое поведение ?
← →
Juice © (2006-12-05 17:26) [24]Как я уже говорил, в студии такой проблемы нет. Но это понятно - я вычитал что она по умолчанию работает с Юникод-строками.
Но вот что еще выяснилось: создав аналогичное "чистое" приложение но в Delphi 5 этой проблемы не возникло !!! Хотя она явно не в Юникоде кодирует ресурсы. Короче, проблема явно в самой Делфи 7, причем явно не в моей - пробовал на двух машинах. Что скажите ?
← →
Juice © (2006-12-07 15:50) [25]В сети на форумах я находил аналогичные вопросы но нигде ответа так и не было. Может кому-то еще пригодится решение этой проблемы. По непонятным МНЕ причинам Delphi 7 извлекает строки из ресурсов беручи не кодовую страницу установленную в системе а основываясь на локали. Например при активной локали "Английский(США)" Delphi берет кодовую страницу 1252, в то время как в системе активна например 1251. Я решил проблему указанием нужной локали перед созданием форм, т.е. после Application.Initialize вызываю SetThreadLocale где в качестве аргумента подаю номер той локали в которая была активна при разработке приложения. Вот так.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c