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

Вниз

юникод 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.17 c
15-1335549150
Влад
2012-04-27 21:52
2013.03.22
Сколько Калькуляторов получится открыть максимально?


15-1333053002
Юрий
2012-03-30 00:30
2013.03.22
С днем рождения ! 30 марта 2012 пятница


15-1351865113
TObject
2012-11-02 18:05
2013.03.22
DBGrid


3-1278782038
TechnoDreamer
2010-07-10 21:13
2013.03.22
DBX Error: Unsupported field type


15-1354259144
Mikishanya
2012-11-30 11:05
2013.03.22
элемент selec с javascript