Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Кодировки, UCS2 в Unicode и братно.


Автор: Control 3.7.2006, 17:04
Ув. Всесильные ГУРУ.
Помогите решить следующую проблемму. Написал клиента по приёму-передаче смс сообщений, когда текст на клиента приходит латинскими буквами, всё здорово работает, но стоит только отослать сообщение кириллицей, приходит какая-то жуткая строка по всей видимости в кодировке UCS2. 
Таким образом отправленное в 8 битной кодировке слово текст выглядит полученном варианте как B5:AB 

Пожалуйсто, если Вам не трудно приведите пример функции на входе которой можно написать слово в  кодировке UCS2 а на выходе она вернёт содержимое преобразованное в UTF8, Unicode и наоборот;

Возможно существует готовый компонент занимающийся этим.
За ранее благодарю. 

Автор: comtat 3.7.2006, 17:09
Код
Function UCS2ToString(s:String):String;
Var i   : Integer;
    wc  : PWideChar;
    c   : Char;
Begin
 Result:='';
 i:=1;
 While i<=Length(s)-1 do
   Begin
     c:=s[i];
     s[i]:=s[i+1];
     s[i+1]:=c;
     Inc(i,2);
   End;
 s:=s+#0;
 wc:=@s[1];
 Result:=WideCharToString(wc);
End;


Чета типа того .. smile 

Автор: AriX 3.7.2006, 17:41
В догонку: есть компонент.
Unicode Library - http://soft-gems.net/UnicodeLibrary.php
Тока не знаю, работает ли он с UCS2. 

Автор: Control 3.7.2006, 17:50
comtat Дружище, огромное спасибо, всё работает ! smile 
А можно ещё такую-же функцию, только наоборот из сторки в UCS2 ? За ранее БОЛЬШОЕ спасибо ! 

Автор: Control 3.7.2006, 18:37
Это получается с каждым последующим символом на 2 бита сдвигать нужно да ? 

Автор: Girder 6.7.2006, 09:35
Цитата(Control @  3.7.2006,  18:50 Найти цитируемый пост)
А можно ещё такую-же функцию, только наоборот из сторки в UCS2 ? За ранее БОЛЬШОЕ спасибо !
Воспользуйся MLang.dll

PS: http://forum.vingrad.ru/index.php?act=Search&f=2
 

Автор: CrazyIvan 14.7.2006, 10:21
Вот, взял с MotoFan, перекодировка туда-обратно.
Код

function UCSToAnsi(s:string):string;

function FMT(C:string):Char;
var i:integer;
begin
 i := StrToIntDef('$'+C,0);
 case i of
  1040..1103: i := i - 848;
  1105      : i := 184;
 end;
 Result := Chr(i);
end;

var C:integer;
   I:integer;
begin
Result := '';
C := Length(S) div 4;
For i:=0 to C-1 do
 Result := Result + FMT(Copy(S,i*4+1,4));
end;

function AnsitoUCS(S:string):string;

function FMT(C:Char):string;
var i:integer;
begin
 Result := '';
 i := ord(C);
 case i of
  192..255 : i := i + 848;
  184      : i := 1105;
 end;
 result := inttohex(i,4)
end;

var C:integer;
   I:integer;
begin
Result := '';
C := Length(S);
For i:=1 to C do
 Result := Result + FMT(S[i]);
end;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)