Текущий архив: 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.nlsprocedure 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