Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

Проблеммы с кодировкой   Найти похожие ветки 

 
Sergey Kaminski ©   (2004-08-25 18:43) [40]


ты совсем что ли? Причем здесь Unicode и локаль? Объясни плиз как сочетается Unicode и локаль? Unicode РАЗРАБАТЫВАЛСЯ для того, чтобы не зависеть от локали.


Молодец, разъяснил мне, непутевому, для чего юникод придумали.

>>wnew ©   (25.08.04 18:28) [37]
Ваши примеры как раз из той области, когда приложение именно и должно использовать юникод, с чем я и не спорил.
А вот вместо нормально русского текста на кнопках я вижу знаки вопроса это несколько другое, имхо.


 
Sergey Kaminski ©   (2004-08-25 19:05) [41]

2 Piter

Может, я слишком сложно изъясняюсь. Попытаюсь попроще:

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

При таком подходе - нет и не может быть никакой проблемы.


 
Anatoly Podgoretsky ©   (2004-08-25 19:14) [42]

Пример офис, IE, OE и другие продукты микрософта, в Дельфи из встроеных, пожалуй только RichEdit (в режиме сохранения RTF) нормально работает, даже на не Юникод Виндоус, но это заслуга Микрософт, а не Борланд.


 
Ertong ©   (2004-08-25 20:37) [43]


>  [7] Piter ©   (25.08.04 01:34)
>  [10] nikkie ©   (25.08.04 13:51)

D7


> хых, любители реестр править... это решается через
> Control Panel - Regional and Language Options - Advanced
> - Language for non-Unicode programs... выставляется нужный
> язык и вуаля... :)

Нет :) Это не помогло!
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Nls\CodePage
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage
1250 - с_1251.nls
1252 - с_1251.nls

procedure TForm1.Button1Click(Sender: TObject);
const str:String="Заголовок";
begin
 Caption:=str;
end;
- пашет, если язык для не юникод программ русский

procedure TForm1.Button1Click(Sender: TObject);
const str:WideString="Заголовок";
begin
 Caption:=str;
end;
- Не пашет

procedure TForm1.Button1Click(Sender: TObject);
const str:WideString="Заголовок";
begin
 SetWindowTextW(handle,PWideChar(str));
end;
- Пашет

Но для лайбела последним методом не сделаеш.:(


 
wnew ©   (2004-08-25 21:05) [44]

Ertong ©   (25.08.04 20:37) [43]

>procedure TForm1.Button1Click(Sender: TObject);
>const str:String="Заголовок";
>begin
> Caption:=str;
>end; - пашет, если язык для не юникод программ русский
>
>procedure TForm1.Button1Click(Sender: TObject);
>const str:WideString="Заголовок";
>begin
> Caption:=str;
> end; - Не пашет

Эти два примера и не могут нормально функционировать, т.к. свойство Caption ожидает значение типа string. В данном случае не имеет значение то, что во втором примере объявлена константа типа WideString, при присвоении Caption всё-равно имеет тип AnsiString.

 А вот с третим примером всё в полном порядке.

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


 
Ertong ©   (2004-08-25 21:16) [45]


> Эти два примера и не могут нормально функционировать, т.к.
> свойство Caption ожидает значение типа string. В данном
> случае не имеет значение то, что во втором примере объявлена
> константа типа WideString, при присвоении Caption всё-равно
> имеет тип AnsiString.

Второй проимер - согласен. Но все таки Дельфи сам вызывает WideCharToMultiByte :)
А первый пример, помойму нормальный.

Интересно то, что в Windows.pas. Все функции обьявлены как Ansi, т.е. нпример SetWindowText -> SetWindowTextА.


 
wnew ©   (2004-08-25 21:52) [46]

Ertong ©   (25.08.04 21:16) [45]
Первый пример, конечно, нормальный, но для русской локализации.

А где это Delphi сама вызывает WideCharToMultiByte?
По моему функции Delphi WideCharLenToStrVar, ну и через неё: WideCharToString, WideCharLenToString, WideCharToStrVar вызывают функцию API WideCharToMultiByte и всё, больше нигде эта функция не вызывается.

Так вот, при попытке чтения Unicode текстового файла, используя функцию WideCharToString для вывода в TMemo (в не русском Windows), ничего хорошего кроме вопросительных знаков вместо русского текста не получается.
  В функции WideCharLenToStrVar модуля System функции WideCharToMultiByte(0, 0, Source, SourceLen, nil, 0, nil, nil) первым параметром передаётся 0, но если вместо ноля передать 1251 - то TMemo в этом случае корректно отображает кириллицу. К сожалению с TRichEdit этот фокус не проходит.
 
  Да, модули VCL править последнее дело. Лучше скопировать эти функции в свой проект и там переделать.


 
nikkie ©   (2004-08-25 21:59) [47]

>[43] Ertong
>D7

ну вот и объяснение. бинарник компилировался на D6+upd2. насколько я помню, эти проблемы с D7 и заставили Piter-a править VCL.

>wnew
Эти два примера и не могут нормально функционировать, т.к. свойство Caption ожидает значение типа string. В данном случае не имеет значение то, что во втором примере объявлена константа типа WideString, при присвоении Caption всё-равно имеет тип AnsiString.

я думаю, все-таки может работать нормально, пусть и не в твоей ситуации, SetThreadLocale должна помочь.

между String и WideString тоже есть разница. попробуй использовать в тексте программы 2 константы - String и WideString, и попробуй после компиляции найти эти константы в exe. String лежит as is, WideString - в виде unicode. преобразование второй константы из ascii в unicode произвел компилятор. получается, что играет роль под какой локалью компилировалась программа.

>А вот с третим примером всё в полном порядке.
да где же все в порядке? на Win9x такая программа и не запустится.


 
nikkie ©   (2004-08-25 22:01) [48]

>А где это Delphi сама вызывает WideCharToMultiByte?
system.pas CharFromWChar
а она вызывается из _LStrFromPWCharLen


 
Piter ©   (2004-08-25 22:09) [49]

Ertong ©   (25.08.04 21:16) [45]
Интересно то, что в Windows.pas. Все функции обьявлены как Ansi, т.е. нпример SetWindowText -> SetWindowTextА.


что значит все? Функция SetWindowTextW не объявлена что ли?

Sergey Kaminski ©   (25.08.04 19:05) [41]
При таком подходе - нет и не может быть никакой проблемы


а почему же ты говоришь о том, что если хочешь чтобы китайская программа работала - то ты обязан выставить китайскую консоль?!


 
Piter ©   (2004-08-25 22:10) [50]

nikkie ©   (25.08.04 21:59) [47]
я думаю, все-таки может работать нормально, пусть и не в твоей ситуации, SetThreadLocale должна помочь


нет


 
Piter ©   (2004-08-25 22:11) [51]

SetThreadlLocale мало чем помогает...


 
Ertong ©   (2004-08-25 22:24) [52]

I>
> что значит все? Функция SetWindowTextW не объявлена что
> ли?

Обявлена, но SetWindowText, намертво ссылается на Ansi версию. Логично было бы делать это через директиви компилятора.


 
Piter ©   (2004-08-25 22:26) [53]

Логично по твоему? Ну вот изменил ты директиву и VCL уже никогда не скомпилируется. Кому это надо? Главное - зачем?


 
Ertong ©   (2004-08-25 22:30) [54]

В идеале VCL должна полностью поддерживать юникод :) Но это только в идеале :(


 
wnew ©   (2004-08-25 22:40) [55]

Ertong ©   (25.08.04 22:30) [54]
Ну посети эту страничку и, возможно, обретёшь счастье:) К примеру, я уже счастлив:)


 
Ertong ©   (2004-08-25 22:55) [56]


> эту страничку

Какую страничку :)


 
Ertong ©   (2004-08-25 22:58) [57]


> между String и WideString тоже есть разница. попробуй использовать
> в тексте программы 2 константы - String и WideString, и
> попробуй после компиляции найти эти константы в exe. String
> лежит as is, WideString - в виде unicode. преобразование
> второй константы из ascii в unicode произвел компилятор.
> получается, что играет роль под какой локалью компилировалась
> программа.

Компилятор перевел отлично


 
wnew ©   (2004-08-25 23:02) [58]

Ertong ©   (25.08.04 22:55) [56]
А забыл ссылку дать:) Но я ранее её уже давал:)
http://tnt.ccci.org/


 
Ertong ©   (2004-08-25 23:09) [59]


> http://tnt.ccci.org/

Качаю, щас посмотрю.


 
Piter ©   (2004-08-25 23:52) [60]

Ertong ©   (25.08.04 22:30) [54]
В идеале VCL должна полностью поддерживать юникод :) Но это только в идеале :(


в смысле, в идеале? Она могла бы поддерживать unicode, но не поддерживает :(


 
nikkie ©   (2004-08-26 00:29) [61]

>Ertong
>Компилятор перевел отлично
либо ты не понял того, что я написал, либо неправильно проверял.

имеем Russian локаль как дефолт. компилируем такую программу:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, Windows;
const
 S1: String = "РУССКИЙ";
 S2: WideString = "НЕМЕЦКИЙ";
begin
 Writeln(Integer(S1[1]));
 Writeln(Integer(S2[1]));
 MessageBox(0, PChar(S1), nil, MB_OK);
 MessageBoxW(0, PWideChar(S2), nil, MB_OK);
end.


запускаем. на выходе имеем:
208
1053
+ читаемый текст в обоих MessageBox.

идем в Regional Settings и ставим Afrikaans как дефолтную локаль. перегружаемся.
запускаем ОТКОМПИЛИРОВАННУЮ программу. на выходе имеем:
208
1053
+ НЕчитаемый текст в первом MessageBox и читаемый во втором.

удаляем exe и компилируем. запускаем. на выходе имеем:
208
205
+ НЕчитаемый текст в обоих MessageBox.

идем в Regional Settings и ставим Russian как дефолтную локаль. перегружаемся.
запускаем ОТКОМПИЛИРОВАННУЮ программу. на выходе имеем:
208
205
+ читаемый текст в первом MessageBox и НЕчитаемый во втором.

думаем.


 
GrayFace ©   (2004-08-26 12:58) [62]

Sergey Kaminski
Если вы расчитываете на использование вашей программы нерусскими, знающими русский язык, то вы обязаны менять Charset. А поскольку это очень просто, отказываться от это глупо. А, вообще, это проблема, прежде всего Delphi с AnsiVCL и DEFAULT_CHARSET"ом по умолчанию.

Ertong ©   (25.08.04 20:37) [43]
Но для лайбела последним методом не сделаеш.:(

У лейбла в свойстве Font есть Charset.


 
Nero   (2004-08-28 13:00) [63]

А нехер себе win ХэРэ ставить! Лучше грузани старую добрую 98



Страницы: 1 2 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.074 c
1-1094397791
Забывший
2004-09-05 19:23
2004.09.19
Как по OnMouseDown чего-либо (панели, к примеру) инциировать...


1-1094188938
Death
2004-09-03 09:22
2004.09.19
Настройка внутренней сети


1-1094555012
begginers
2004-09-07 15:03
2004.09.19
browser


14-1093603838
SergP
2004-08-27 14:50
2004.09.19
Чем можно сделать chm?


3-1093005881
Wolfram
2004-08-20 16:44
2004.09.19
Про кавычки