Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Unicode в Строку   Найти похожие ветки 

 
Mouserx   (2005-02-15 18:06) [0]

Скажите как перевести юникод в строку.
Есть у меня некий блок данных, где каждый байт - буква в формате иникод. Как мне текст из этого блока данных получить в виде строки?


 
Юрий Зотов ©   (2005-02-15 18:22) [1]

> каждый байт - буква в формате иникод

Разве в юникоде не двухбайтовые символы?


 
Mouserx   (2005-02-15 18:46) [2]


> Юрий Зотов

Я ошибся. 2 байта.
Имееться ввиду например есть у меня SHex : String в которой содержиться последовательность байтиков в 16-ричном ввиде.
Эта последовательность байтиков - Null Terminated Unicode message

Меня волнует как получить текст из этой последовательности и как сделать обратное действие.


 
Anatoly Podgoretsky ©   (2005-02-15 19:25) [3]

Тогда повторно ошибся, для представления одного символа требуется лва байта, для юникода соотвественно 4.


 
Vit@ly ©   (2005-02-15 19:29) [4]

:)?


 
Alexander Panov ©   (2005-02-15 19:29) [5]

см. MultiByteToWideChar


 
Anatoly Podgoretsky ©   (2005-02-15 19:31) [6]

Alexander Panov ©   (15.02.05 19:29) [5]
Думаешь? Он эе молчит о точном формате данные, пока не приведет образец данных можно только гадать, а это дело неблагодарное :-(


 
Mouserx   (2005-02-15 19:55) [7]


> Anatoly Podgoretsky


Почему 4?

а можно пример пожалуйста для моего случая?


 
Anatoly Podgoretsky ©   (2005-02-15 19:57) [8]

Потому что Юникод16 это 2 байта, а в двух хекс символах можно отразить только один байт. Вспоиминая математику получаем 2*2 итого 4 символа, оно же в просторечье 4 байта. напримет код 00 00 (два байта) в хекс будет "0000"


 
Eraser ©   (2005-02-15 21:05) [9]

Mouserx

Откуда у тебя эта последовательность байтиков в 16-ричном ввиде?
Может не стоит так заморачиваться...


 
Mouserx   (2005-02-15 21:09) [10]


> Anatoly Podgoretsky

Ето я знаю,
но в [3] вы мне говорите про 4 байта а это уже будет в хекс 8 символов.

И собственно по сабжу.
Вот например в SHex у меня есть следующее:
"04 3F 04 40 04 38 04 3C 04 35 04 40 00 00"

как мне получить из этого нужную строку и наоборот?

Покажите пожалуйста код. Спасибо.


 
Mouserx   (2005-02-15 21:14) [11]


> Eraser ©   (15.02.05 21:05) [9]
> Mouserx
>
> Откуда у тебя эта последовательность байтиков в 16-ричном
> ввиде?


С игрушки.


> Может не стоит так заморачиваться...

Стоит. Очень надо.


 
Eraser ©   (2005-02-15 21:15) [12]

Mouserx

И там именно строка с хекс кодами?
Или всётаки как-нибудь можно достать указатель на эти данные?


 
Adder ©   (2005-02-15 21:19) [13]

Примерно так...

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.


 
Anatoly Podgoretsky ©   (2005-02-15 21:21) [14]

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:22) [15]

ps В Edit1 - копируешь свою SHex, в Memo1 - увидишь строку


 
Eraser ©   (2005-02-15 21:25) [16]

Anatoly Podgoretsky ©

А разве StrToInt умеет преобразовывать hex символы?


 
Mouserx   (2005-02-15 21:27) [17]


> Eraser [12]


Я так разбираю каждый пакетик по байтикам и мне удобнее работать с SHex (16-тиричное представление)

Надо указатель - загоню эти данные в буффер и получу указатель.


 
Eraser ©   (2005-02-15 21:29) [18]

Mouserx

В данном случае удобнее работать с буффером, тогда алгоритм Подгородецкого упроститься в 2 раза.


 
Anatoly Podgoretsky ©   (2005-02-15 21:29) [19]

Не может, но может преобразовывать числа в стандартной хекс нотации Паскаля.
Если не понятно, то в разных языках программирования существует разная нотация для двоичных, восьмеричных и шестнадцатиричных представлений чисел. Для этого используются префиксы или суфиксы, для трех очень растространеных языков это.
C      - префикс 0x
Pascal - префикс $
ASM    - ceaabrc h, число должно начинаться с десятичной цифры


 
Anatoly Podgoretsky ©   (2005-02-15 21:31) [20]

ceaabrc в переводе на человеческий язык равен суффикс


 
Eraser ©   (2005-02-15 21:35) [21]

Anatoly Podgoretsky ©

Вы хотите сказать, что если я напишу

var s: string;
   i: integer;

s:="$A";
i:=strtoint(s);
showmessage(inttostr(i));

У меня вылезит окошко с надписью 10?


 
Anatoly Podgoretsky ©   (2005-02-15 21:36) [22]

А проверить религия не позволяет?


 
Eraser ©   (2005-02-15 21:43) [23]

Запустил делфя- проверил.
Чудеса!!! Работает!

Это наверное появилось в последних версиях делфей...?
Когда я начинал заниматься делфи, тогда 5 версия была, так вот, купил книгу Фаронова (по-моему) для начинающих. Так вот там был в примере описан алгоритм преобразования хексовой строки в целочисленный тип...
С тех пор я пребывал в заблуждении насчёт функции StrToInt...

Спасибо огромное, что открыли глаза!!!


 
Anatoly Podgoretsky ©   (2005-02-15 21:44) [24]

Это появилось в первых версиях паскаля.


 
Anatoly Podgoretsky ©   (2005-02-15 21:48) [25]

На книгу не стоит обижаться, там приводятся примеры работы с разными аспектами языка, они даже не обязаны быть рабочими.


 
Eraser ©   (2005-02-15 21:49) [26]

Anatoly Podgoretsky ©

В первых версиях паскаля, по-моему вообще не было ф-ии StrToInt, там она как-то подругому называлась... забыл как, но по-другому.


 
Anatoly Podgoretsky ©   (2005-02-15 21:53) [27]

Зато были другие, а данная функция существует начиная с Д1


 
Eraser ©   (2005-02-15 21:58) [28]

Anatoly Podgoretsky ©

Ещё раз благодарю за просветление.
Бывает же так, всю жизнь живёшь и думаешь, что земля круглая, а она оказывается квадратной ))


 
Anatoly Podgoretsky ©   (2005-02-15 22:01) [29]

Не прав, она в форме чемодана, одной из трех черепах.


 
Mouserx   (2005-02-16 13:04) [30]

Есть одна неувязочка по поводу конверации Unicode в SHex

Код:

procedure TForm1.Button1Click(Sender: TObject);
var SHex : String;
   WS : WideString;
   i,len : integer;
   S : String;
begin
SHex := "043F04400438043C043504400000";
WS := "";
i := 1;
while (i < Length(SHex) + 1) and (Copy(SHex,i,4) <> "0000") do
begin
WS := WS + WideChar(strtoint("$"+Copy(SHex,i,4)));
i:=i+4;
end;
Form1.Edit1.Text := WideCharToString(Pointer(WS));

S := "пример";
SHex := "";
StringToWideChar(S,Pointer(WS),Length(S));
for i := 1 to Length(WS) do SHex := SHex + IntToHex(ord(WS[i]),4);
Form1.Edit2.Text := SHex;
end;


В первом части все отлично работает. получаю я из SHex свое слово "пример". Но вот во второй части вместо первой буквы - "0000".
И в конце "0000" мне необходимо будет самому добавлять?


 
palva ©   (2005-02-16 14:12) [31]

Mouserx   (15.02.05 21:09) [10]
>И собственно по сабжу.
>Вот например в SHex у меня есть следующее:
>"04 3F 04 40 04 38 04 3C 04 35 04 40 00 00"
>как мне получить из этого нужную строку и наоборот?
>Покажите пожалуйста код. Спасибо.

uses Dialogs;
var
 sHex: array of Word;
 s_new: String;
begin
 SetLength(sHex, 7);
 sHex[0] := $043F;
 sHex[1] := $0440;
 sHex[2] := $0438;
 sHex[3] := $043C;
 sHex[4] := $0435;
 sHex[5] := $0440;
 sHex[6] := $0000;
 s_new := WideString(sHex);
 ShowMessage(s_new);
end.


 
palva ©   (2005-02-16 14:25) [32]

Mouserx   (15.02.05 21:09) [10]
Обратно:

uses SysUtils, Dialogs;
var
 sHex: array of Word;
 s: String;
 ws: WideString;
begin
 s := "Строка";
 ws := s;
 SetLength(sHex, Length(ws)+1);
 Move(ws[1], sHex[0], Length(ws)*2+1);
 ShowMessage(IntToHex(sHex[3], 4));
end.


 
palva ©   (2005-02-16 14:27) [33]

Ошибка:
Move(ws[1], sHex[0], Length(ws)*2+2);


 
Mouserx   (2005-02-16 15:48) [34]

Ну вроде бы все работает:


procedure TForm1.Button1Click(Sender: TObject);
var SHex : String;
   WS : WideString;
   i : integer;
   S : String;
   TempArray : Array of Word;
begin
SHex := "043F04400438043C043504400000";
WS := "";
i := 1;
while (i < Length(SHex) + 1) and (Copy(SHex,i,4) <> "0000") do
begin
WS := WS + WideChar(strtoint("$"+Copy(SHex,i,4)));
i:=i+4;
end;
Form1.Edit1.Text := WideCharToString(Pointer(WS));

S := "пример";
WS := S;
SHex := "";
SetLength(TempArray, Length(ws)+1);
Move(ws[1], TempArray[0], Length(ws)*2+2);
i := 0;
while i < Length(TempArray) do
begin
SHex := SHex + IntToHex(TempArray[i],4);
i := i+1;
end;
Form1.Edit2.Text := SHex;
end;


Спасибо всем за помошь.



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.049 c
14-1108588949
Луарвик
2005-02-17 00:22
2005.03.06
Хост базы MySQL


14-1108280948
Сергей Суровцев
2005-02-13 10:49
2005.03.06
Минус на минус дает Большой минус!


1-1108972403
Sour Smile
2005-02-21 10:53
2005.03.06
Как освободить ресурсы занятые функцией StringToOleStr?


14-1108102830
Soft
2005-02-11 09:20
2005.03.06
Умные люди глупеют под давлением.


14-1108581372
Nicto
2005-02-16 22:16
2005.03.06
Кодекс от 15 февраля 2005. ( философия )