![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
юникод 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;