![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Unicode в Строку
Mouserx © (2005-02-15 18:06:00)Скажите как перевести юникод в строку.
Есть у меня некий блок данных, где каждый байт - буква в формате иникод. Как мне текст из этого блока данных получить в виде строки?
Anatoly Podgoretsky (2005-02-15 21:21:00) [21]Mouserx (15.02.05 21:09) [10]
Вот например в SHex у меня есть следующее:
'04 3F 04 40 04 38 04 3C 04 35 04 40 00 00'
Узнаю русский язык.
Надо отдельно преобразвывать четную и нечетную пару к виду $O43F, эту последовательность через StrToInt присваивать WideChar или к WideString[i], пока не встретишь код $0000 это признак конца строки. Вот такой алгоритм. Код напишешь сам, он тривиальный.
Adder (2005-02-15 21:19:00) [22]Примерно так...
unit UnicodeUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,WinSock, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Panel1: TPanel;
Panel2: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
Size:integer;
s:String;
Buffer:PByte;
B:PWord;
W:PWideChar;
begin
S:=StringReplace(Edit1.Text,' ','',[rfReplaceAll]);//+'0000';
if S<>'' then
begin
GetMem(Buffer,Length(S) div 2);
Size:=HexToBin(PChar(@S[1]), PChar(Buffer), Length(S) div 2);
b:=PWord(Buffer);
i:=0;
while i < Size do begin b^:=htons(b^);Inc(b,1);inc(i,2);end;
W:=PWideChar(Buffer);
Memo1.Lines.Add(WideCharLenToString(W,Size));
end;
end;
end.
Eraser (2005-02-15 21:15:00) [23]Mouserx
И там именно строка с хекс кодами?
Или всётаки как-нибудь можно достать указатель на эти данные?
Mouserx (2005-02-15 21:14:00) [24]
> Eraser © (15.02.05 21:05) [9]
> Mouserx
>
> Откуда у тебя эта последовательность байтиков в 16-ричном
> ввиде?
С игрушки.
> Может не стоит так заморачиваться...
Стоит. Очень надо.
Mouserx (2005-02-15 21:09:00) [25]
> Anatoly Podgoretsky
Ето я знаю,
но в [3] вы мне говорите про 4 байта а это уже будет в хекс 8 символов.
И собственно по сабжу.
Вот например в SHex у меня есть следующее:
'04 3F 04 40 04 38 04 3C 04 35 04 40 00 00'
как мне получить из этого нужную строку и наоборот?
Покажите пожалуйста код. Спасибо.
Eraser (2005-02-15 21:05:00) [26]Mouserx
Откуда у тебя эта последовательность байтиков в 16-ричном ввиде?
Может не стоит так заморачиваться...
Anatoly Podgoretsky (2005-02-15 19:57:00) [27]Потому что Юникод16 это 2 байта, а в двух хекс символах можно отразить только один байт. Вспоиминая математику получаем 2*2 итого 4 символа, оно же в просторечье 4 байта. напримет код 00 00 (два байта) в хекс будет '0000'
Mouserx (2005-02-15 19:55:00) [28]
> Anatoly Podgoretsky
Почему 4?
а можно пример пожалуйста для моего случая?
Anatoly Podgoretsky (2005-02-15 19:31:00) [29]Alexander Panov © (15.02.05 19:29) [5]
Думаешь? Он эе молчит о точном формате данные, пока не приведет образец данных можно только гадать, а это дело неблагодарное :-(
Alexander Panov (2005-02-15 19:29:00) [30]см.
MultiByteToWideChar
Vit@ly (2005-02-15 19:29:00) [31]:)?
Anatoly Podgoretsky (2005-02-15 19:25:00) [32]Тогда повторно ошибся, для представления одного символа требуется лва байта, для юникода соотвественно 4.
Mouserx (2005-02-15 18:46:00) [33]
> Юрий Зотов
Я ошибся. 2 байта.
Имееться ввиду например есть у меня SHex : String в которой содержиться последовательность байтиков в 16-ричном ввиде.
Эта последовательность байтиков - Null Terminated Unicode message
Меня волнует как получить текст из этой последовательности и как сделать обратное действие.
Юрий Зотов (2005-02-15 18:22:00) [34]> каждый байт - буква в формате иникод
Разве в юникоде не двухбайтовые символы?