Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблемы русского языка в Delphi


Автор: Oleg 30.3.2003, 00:23
У меня прога, созданная в делфях (все шрифты форм по умолчанию, язык русский), в некоторых аккаунтах винды2000 пишет вместо русских слов confused.gifconfused.gif? confused.gif confused.gif?? confused.gif ??, причем на одном и том же компе, просто юзера разные. Просто шрифта не хватает, или нужно чето в проге изменить?

Автор: serious 30.3.2003, 00:39
Может в винде дело? Какая винда-то, кстати? SP или еще чего?

Автор: Alex 31.3.2003, 15:44
Если вам высвечиваются вместо букв знаки вопроса то это проблема Unicode возможно какие-то из компонентов, которые вы используете, ее не поддерживают. Проблема очень хорошо известна пользователям ХР, она возникает при копировании русского текста к примеру из Delphi в блокнот в том случае когда установлена английская раскладка клавиатуры. Чтобы скопировать текст нормально нужно перед копированием переключиться на русскую раскладку и спокойно копировать все будет нормально. Да кстати, а какая Delphi

Автор: Oleg 31.3.2003, 19:22
Borland Delphi7, Microsoft Windows 2000 v 5.00.2195 ServicePack 3.
Да ничего я вроде экзотического не использую. Я ж говорю, во всех формах проекта, начиная с главной такая вот белибердень.

Автор: SmaLL 31.3.2003, 19:41
У меня дома всЁ стоит аналогичное и всЁ - ОК
А на работе Д6, так перенос у меня никаких проблем не вызывает.

Если формы сохранены как текст, то как это дело в фаре отображается или в блокноте??

Посмотри в настройках какой используется шрифт для отображения в ID.

И ещЁ, типа можно попробовать в реестре в NLS/Codepages поменять 1252 на 1251...

Автор: 3D-Dragon 3.4.2003, 17:57
патч реестра вылечит ...

9x.ME.reg
Код
REGEDIT4

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Nls\Codepage]
"1250"="cp_1251.nls"
"1251"="cp_1251.nls"
"1252"="cp_1251.nls"
"1253"="cp_1251.nls"
"1254"="cp_1251.nls"
"1257"="cp_1251.nls"


NT.2k.XP.reg
Код
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"
"1253"="c_1251.nls"
"1254"="c_1251.nls"
"1255"="c_1251.nls"


Автор: Alexeis 13.7.2006, 14:28
Заново поднимаю эту тему!
Указанный патч не безапасен если в системе установленно кроме руского и английского языков какой нибудь еще. При этом нарушается правельное определенияе раскладок клавиатуры.
Если у вас установлено три или более языков ни в коем случае не делайте такой патч - я таким образом попортил реестры на двух компах, один из которых мой smile  smile  

Автор: Yanis 13.7.2006, 14:33
Добавлю только, что Snowy очень хорошо отписался о решении этой проблемы.
http://forum.vingrad.ru/index.php?showtopic=82093

alexeis1
Ручами можно исправить там где испорчено smile 

Автор: Alexeis 13.7.2006, 14:52
Yanis, Эту тему я хорошо знаю, но этот пач лечил не только свои, но и чужие проги имеющие те же проблемы! А мне не свою лечить надо было! Оказывается не лечил, а калечил винду.
Цитата(Yanis @  13.7.2006,  14:33 Найти цитируемый пост)
Ручами можно исправить там где испорчено

<offtop>это понятно но догадался кто виноват я лишь тогда, когда узнал, что на втором компе те же глюки что и у меня!</offtop>

 

Автор: Snowy 13.7.2006, 15:13
Цитата(3D-Dragon @  3.4.2003,  17:57 Найти цитируемый пост)
"1252"="c_1251.nls"
Нужна только эта строчка.
Остальные трогать не нужно.
Кроме того, выставить в региональных настройках русский для неюникодных программ.
Если это не подходит, то писать лаунчер, который будет делать SetThreadLocale для запускаемоу программы. 

Автор: Alexeis 13.7.2006, 15:48
Цитата(Snowy @  13.7.2006,  15:13 Найти цитируемый пост)
 который будет делать SetThreadLocale для запускаемоу программы

т.е. так smile 
createpocess(...,...,'some.exe',somethreadID,.... );
SetThreadLocale(somethreadID,1251);  

Автор: Snowy 13.7.2006, 16:03
Угу. Правда не разу не пробовал, но по логике должно работать.
Запускаемая программа на дельфи? 

Автор: Alexeis 13.7.2006, 16:10
Цитата(Snowy @  13.7.2006,  16:03 Найти цитируемый пост)
Запускаемая программа на дельфи? 

думаю нет, да речь идет не только об одной проге, такая ситуация появляется довольно часто с недоотлажеными прогами.
Тема немного откланилась я попробую как сказал Snowy, как получится отпишусь... 

Автор: Alexeis 14.7.2006, 09:42
Очередной раз убеждаюсь windows хорошо работает, только если на него ничего не установлено и поставлен он с настройками по умалчанию
smile smile
Найти "концы" я так и не смог, но хоть и криво но все поправил!
Однако (теперь по теме), обнаружил, что
SetThreadLocale - работает только с текущим потоком, а это значит, что без заморочки с хуками здесь не обойтись - получится совсем криво smile
Может кто знает такую же функцию (SetThreadLocale), но только для внесения изменений в чужой поток? 

Автор: Yanis 14.7.2006, 10:12
Цитата(alexeis1 @  14.7.2006,  10:42 Найти цитируемый пост)
SetThreadLocale - работает только с текущим потоком

Цитата(MSDN)
The SetThreadLocale function sets the calling thread's current locale.


Цитата(alexeis1 @  14.7.2006,  10:42 Найти цитируемый пост)
Может кто знает такую же функцию (SetThreadLocale), но только для внесения изменений в чужой поток?

Цитата(Snowy @  13.7.2006,  16:13 Найти цитируемый пост)
писать лаунчер, который будет делать SetThreadLocale для запускаемоу программы.

Наверное это самый простой способ. 

Автор: Alexeis 14.7.2006, 10:34
Yanis че`т я не понял последнего поста.
Про MSDN я и сам знаю, по нему и писал пост....?????

Так лаунчер это друрой поток, свой поток (лаунчера) он настроит, а вот поток приложения (для него чужой) который запустит лаунчер я не могу настроить, при помощи этой функции. 



 

Автор: Yanis 14.7.2006, 11:13
alexeis1, Snowy имел ввиду запуск дочернего (или не дочернего) процесса и уже "из него" вызвать SetThreadLocale путём вызова CreateRemoteThread(hRemouteProc, ..... Тока перед этим надобно память выделить в процессе кажется smile 

Автор: Alexeis 14.7.2006, 11:22
Цитата(Yanis @  14.7.2006,  11:13 Найти цитируемый пост)
запуск дочернего (или не дочернего) процесса

Это что-то новенькое, про дочерний поток я слышал, а проэто нет!

Цитата(Yanis @  14.7.2006,  11:13 Найти цитируемый пост)
уже "из него" вызвать SetThreadLocale

Так как же я могу это сделать из него - он же чужая программа, не встраивать же в него свой код!

А вот про CreateRemoteThread тоже не слышал - сейчас буду разбираться!

Добавлено @ 11:31 
Ух-ты CreateRemoteThread - это серьезно буду пробовать, а вот
Цитата(Yanis @  14.7.2006,  11:13 Найти цитируемый пост)
 Тока перед этим надобно память выделить в процессе кажется 

этого в helpe я не увидел!
 

Автор: Yanis 14.7.2006, 11:43
alexeis1
Я в этом советчик не очень хороший. Но сам посуди - мы вызываем функцию о которой процесс и не знает, причём ещё и параметры нуна передавать ему. На сколько я понимаю проще всего сделать внедрение dll. По этому поводу есть хороший пример у роуза на его сайте.
http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=0239ef6752fa8e2b3eb5c67989895be2&search_in=posts&result_type=topics&flag=search&debug=&highlite=%E2%ED%E5%E4%F0%E5%ED%E8%E5+and+%EA%EE%E4&skipped= 

Автор: Alexeis 14.7.2006, 12:16
Понял! память нужна если мы хотим передать что-то этому "присосавшемуся" потоку, а если нет, то я думаю можно обойтись nil
Спасибо Yanis! 

Автор: Yanis 14.7.2006, 13:25
alexeis1
Могу накатать пример с получением командной строки чужого процесса. Суть тут та же: вызов функции GetCommandLine из чужого процесса, т.к. GetCommandLine позволяет получать только "свою" коммандную строку. Правда без CreateRemouteThred, но довольно показательный пример.

P. S. мона и через CreateRemouteThred извратиться, т.к. GetCommandLine возврящает всего 4 байта 

Автор: bems 14.7.2006, 13:53
Тут еще попутно такой вопрос, а не знает кто, как в консоли русский текст нормально выводить? 

Автор: Snowy 14.7.2006, 14:09
Знаем.
Или перекодировать в OEM (AnsiToOEM)
или выводить в юникоде. 

Автор: Yanis 14.7.2006, 14:34
bems
В чужой консоли? smile 

Автор: Alexeis 14.7.2006, 14:52
Yanis, Не он в своей, в чужой-то он ничего не выведет smile  

Автор: Snowy 14.7.2006, 14:54
SetConsoleCP
SetConsoleOutputCP 

Автор: bems 17.7.2006, 08:45
Цитата(Snowy @  14.7.2006,  14:54 Найти цитируемый пост)
SetConsoleCP
SetConsoleOutputCP  
Вот это и интригует. Вроде функции специально для этого предназанчены, но чтобы заработало так и не вышло  smile 
Цитата(alexeis1 @  14.7.2006,  14:52 Найти цитируемый пост)
Yanis, Не он в своей, в чужой-то он ничего не выведет 
А это как понимать?
 

Автор: Alexeis 17.7.2006, 09:02
Цитата(bems @  17.7.2006,  08:45 Найти цитируемый пост)
А это как понимать?

Я понял, что русский теткст не выводится в консоли написаной вами, а не в программе написанной другим человеком, другими словами вы пытаетесь исправить свои ошибки, а не ошибки автора чужой программы. Вопрос был задан потому, что тема была поднята, как попытка исправить недароботки в чужих программах.  

Автор: Alexeis 17.7.2006, 09:37
Код

program Project1;

{$APPTYPE CONSOLE}
uses
   windows;
procedure MyWriteln(const S: string);
var
  NewStr: string;
begin
  SetLength(NewStr, Length(S));
  CharToOEM(PChar(S), PChar(NewStr));
  Writeln(NewStr);
end;

begin
  MyWriteln('русский язык');
  Writeln('русский язык');
  Readln;
end.
   

Автор: Ramin 17.7.2006, 11:02
Цитата(Oleg @ 30.3.2003,  00:23)
У меня прога, созданная в делфях (все шрифты форм по умолчанию, язык русский), в некоторых аккаунтах винды2000 пишет вместо русских слов ??????? ??? ????? ??? ??, причем на одном и том же компе, просто юзера разные. Просто шрифта не хватает, или нужно чето в проге изменить?

не читал посты который ответили тебя но ты посмотри на Языке и Регионалы... какой чзык там у тя стоит? 

Автор: Yanis 17.7.2006, 11:47
Ramin
Я думаю, что вопрос 3-х летней давности уже решён. 

Автор: bems 17.7.2006, 12:05
Yanis, 
alexeis1, в своей
Цитата(alexeis1 @  17.7.2006,  09:37 Найти цитируемый пост)
MyWriteln('русский язык');
  Writeln('русский язык');
Хотелось бы русифицировать саму консоль и писать обычным Writeln.
Вот SetConsoleOutputCP по описанию - то что надо, но в моих кривых руках не работает.
 

Автор: Alexeis 17.7.2006, 13:12
bems, Я прогнал 2100 страниц - от 1 до 2100
Все одно и тоже, эти функции не меняют кодировку 

Автор: Alexeis 17.7.2006, 13:54
А вот так можно все кодировки просмотреть - результат анологичний
Код

program Project1;

{$APPTYPE CONSOLE}
uses
   windows, SysUtils, Registry, Classes;

procedure MyWriteln(const S: string);
var
  NewStr: string;
begin
  SetLength(NewStr, Length(S));
  CharToOEM(PChar(S), PChar(NewStr));
  Writeln(NewStr);
end;

 var
   i,j, v: Integer;
   k : Boolean;
   r : TRegistry;
   l : TStringList;

begin
   r:=  TRegistry.Create;
   r.RootKey := HKEY_LOCAL_MACHINE;
   k := r.OpenKey('SYSTEM\CurrentControlSet\Control\Nls\CodePage', false);
   l := TStringList.Create;
   r.GetValueNames(l);
   for i := 0 to l.Count - 1
   do
     Begin
       if trystrtoint(l[i], v)
       then
         k := SetConsoleOutputCP(v);
         if k
         then
           begin
            Writeln(l[i]);
            Writeln('русский язык');
           end;
     end;
   r.CloseKey;
   r.Free;
   l.Free;
  Readln;
end.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)