Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

юникод DelphiXE


ramster ©   (2012-08-07 13:34:00) 

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

sA: AnsiString
sU: UnicodeString;

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


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

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

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

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

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

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


Anatoly Podgoretsky   (2012-08-07 15:59:00) [2]

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


ProgRAMmer Dimonych   (2012-08-07 15:57:00) [3]

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


Anatoly Podgoretsky   (2012-08-07 15:57:00) [4]

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


Anatoly Podgoretsky   (2012-08-07 15:56:00) [5]


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

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


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

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:02:00) [7]

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

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


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

ProgRAMmer Dimonych ©, почти.

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

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

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

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

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


ProgRAMmer Dimonych   (2012-08-07 14:34:00) [9]

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


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

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

объявил  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) ?


Anatoly Podgoretsky   (2012-08-07 13:55:00) [11]

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

AnsiString(1251)


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо