Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

юникод DelphiXE   Найти похожие ветки 

 
ramster   (2012-08-07 13:34) [0]

Есть ли какая-то директива или т.п. для указания кодовой страницы по умолчанию при присвоении юникодным строкам анси строк?

sA: AnsiString
sU: UnicodeString;

sU:= sA; // необходимо по умолчанию что бы 1251 кодировка устанавливалась.


 
И. Павел ©   (2012-08-07 13:52) [1]

Если у вас анси-строка в кодировке 1251, то можно объявить это явно:
RusString = type AnsiString(1251);
var s: RusString;


 
Anatoly Podgoretsky ©   (2012-08-07 13:55) [2]

> ramster  (07.08.2012 13:34:00)  [0]

AnsiString(1251)


 
ramster   (2012-08-07 14:28) [3]

У меня есть одна выходная процедура, которой с разных модулей передаются строковые данные объявлены как юникодные.

объявил  CyrillicString = type AnsiString(1251);
автозаменой прошелся вроде бы по всем модулям  AnsiString на CyrillicString, но проблема осталась.

Нашел функцию:

function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
 l: integer;
begin
 if s = "" then
   Result := ""
else
 begin
   l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PAnsiChar(@s[1]), -1, nil,
     0);
   SetLength(Result, l - 1);
   if l > 1 then
     MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PAnsiChar(@s[1]),
       -1, PWideChar(@Result[1]), l - 1);
 end;
end;

вот если в своей выходной процедурке:

procedure myOut(const val: String);
var
 s: String;
begin
 s:= StringToWideString(val, 1251);

 bmp.canvas.textOut(0,0, s);   //  теперь отрисовывается кирилица, иначе каракули

end;

В DelphiXE2 есть аналог StringToWideString ?  (может через TEncoding) ?


 
ProgRAMmer Dimonych ©   (2012-08-07 14:34) [4]

Смахивает на перевод проекта с ANSI на Unicode.


 
ramster   (2012-08-07 14:46) [5]

ProgRAMmer Dimonych ©, почти.

Дело в том, что ранее модули работали с ансистроками.
Новые модули уже пишу под юникод.

в старом модуле текст находился в буфере, который определен как PAnsiChar;
Далее парсится буфер и собирается ансистрока, которая и передается  в procedure myOut(const val: String);

так вот определил:

CyrillicString = type AnsiString(1251);
...
ss: CyrillicString;
ss:= parseBlock(buff: PAnsiChar): CyrillicString;
myOut(ss);

В myOut пробую отрисовать на битмапе переданную строку - получаю каракули вместо кирилицы. Если преобразовываю через StringToWideString - отрисовывается правильно.


 
Anatoly Podgoretsky ©   (2012-08-07 15:02) [6]

А вместо myOut приводишь вызов parseBlock

А тут нет PAnsiChar, тут UnicodeString
myOut(const val: String);


 
ramster   (2012-08-07 15:29) [7]

Anatoly Podgoretsky ©, никак не могу ухватить Вашу мысль..

..
ss: CyrillicString;
ss:= parseBlock(buff: PAnsiChar): CyrillicString;
..

Я так понимаю, что главное присвоение должно быть тут:
myOut(ss);

тоесть если там описана входная строка юникодная, то при передаче ансистроки, так как я указываю что CyrillicString = AnsiString(1251) и должно произойти преобразование анси в юникод с установкой кодировки 1251.

и уже в самой:

procedure myOut(const val: String);
begin

 val по идее должна быть преобразована в юникод с кодировкой 1251

end;

или я неправильно понимаю?

ss: CyrillicString;
buff: PAnsiChar;
..
ss:=  buff[0]+buff[1] + buff[2] + buff[3];
myOut(ss); // -> я думал что тут должна быть переведена в юникод 1251


 
Anatoly Podgoretsky ©   (2012-08-07 15:56) [8]


> и уже в самой:
>
> procedure myOut(const val: String);
> begin
>
>  val по идее должна быть преобразована в юникод с кодировкой
> 1251
>
> end;

Это если кодировка явно указана, иначе из кодировки по умолчанию. И не в Юникод с кодировкой ХХХ, в Юникоде вообще нет кодировки, оно включает в себя все кодировки, как минимум 1 миллион отдельных символов.


 
ProgRAMmer Dimonych ©   (2012-08-07 15:57) [9]

Чёт как-то. А почему буфер не сделать юникодным? Или, если это невозможно (заполняется извне), - конвертировать в юникод сразу при получении?


 
Anatoly Podgoretsky ©   (2012-08-07 15:57) [10]

Читай http://podgoretsky.com/ftp/Docs/Delphi/Unicode_Delphi-RUS.pdf


 
Anatoly Podgoretsky ©   (2012-08-07 15:59) [11]

И также http://ru.wikipedia.org/wiki/UTF-16


 
ramster   (2012-08-07 17:54) [12]

проблема решилась

CyrillicString = type AnsiString(1251);
..
ss: CyrillicString
buff: PAnsiChar;
..

ss:= ss + CyrillicString(buff[x]);

до этого  ss:= ss + buff[x];

а для PAnsiChar нельзя ли указать кодовую страницу? ))))



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.103 c
2-1343366420
EgorovAlex
2012-07-27 09:20
2013.03.22
Хранение данных в dll, используемой несколькими процессами


15-1346775365
pasha_golub
2012-09-04 20:16
2013.03.22
Как привести TList<TField> к простому TList


4-1258957583
pg81
2009-11-23 09:26
2013.03.22
Как получить в переменную frm:TForm зная Handle окна?


2-1334127903
Gimbomba
2012-04-11 11:05
2013.03.22
Проблема с bde table в Embarcadero Delhpi XE2


2-1337924665
leklerk
2012-05-25 09:44
2013.03.22
Отослать сообщения пользователям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский