Главная страница
    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.072 c
15-1329929995
Artem
2012-02-22 20:59
2013.03.22
Почему Com-порт может сбоить?


15-1338429114
Думкин
2012-05-31 05:51
2013.03.22
Жизнь


15-1343593203
alexdn
2012-07-30 00:20
2013.03.22
Марс


15-1345469782
Handler
2012-08-20 17:36
2013.03.22
outlook.com vs gmail.com


15-1329506289
TUser
2012-02-17 23:18
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский