Форум: "Начинающим";
Текущий архив: 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.103 c