Главная страница
    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.066 c
15-1334126868
xss22
2012-04-11 10:47
2013.03.22
Как записать TMemIniFile в TMemoryStream и обратно?


15-1349987402
Юрий
2012-10-12 00:30
2013.03.22
С днем рождения ! 12 октября 2012 пятница


4-1261361454
SPeller
2009-12-21 05:10
2013.03.22
Проблема с циклом выборки сообщений


2-1334912268
ChainikDenis
2012-04-20 12:57
2013.03.22
Изменение размера TreeView


15-1283595915
xayam
2010-09-04 14:25
2013.03.22
Обновилась база веток DMSearch





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский