Сообщение от AssA
провел тест на LG ( gw300 ):
binsock.debug_register(0);
binsock.enable_debug(-1);
ansi:
отправил: 123фф123
на тел:123? ( len = 4 )
utf-8:
отправил: 123фф123
на тел: 123фф123 ( len = 8 )
......
то есть засада в функции binsock.read_bin() - мне кажется, когда присваивается результат, NOKIA и LG воспринимают это по-разному: нокиа строго раскладывает побайтно, lg в этом потоке бинарных данных рассматривает utf8 символы и преобразует находу. можно ли и NOKIA заставить "распознавать" строку UTF-8 ?
|
1. На Delphi :
Перевожу русские буквы в base64, и отправляю в сокет ...Socket.Connections[i].SendText(AnsiToBase64('ваш текст' + '@')),
где например @ --- дополнительно обозначаю конец текста
function AnsiToBase64(S : String):String;
var
SS : string;
begin
SS:=Utf8Encode(S);
SS:=EncodeBase64(SS);
result:=SS;
end;
где, Utf8Encode --- стандартная ф-ция библиотеки System
EncodeBase64 :
function EncodeBase64(Value: String): String;
const
b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
pad: PChar = '====';
function EncodeChunk(const Chunk: String): String;
var
W: LongWord;
i, n: Byte;
begin
n := Length(Chunk); W := 0;
for i := 0 to n - 1 do
W := W + Ord(Chunk[i + 1]) shl ((2 - i) * 8);
Result := b64alphabet[(W shr 18) and $3f] +
b64alphabet[(W shr 12) and $3f] +
b64alphabet[(W shr 06) and $3f] +
b64alphabet[(W shr 00) and $3f];
if n <> 3 then
Result := Copy(Result, 0, n + 1) + Copy(pad, 0, 3 - n);
end;
begin
Result := '';
while Length(Value) > 0 do
begin
Result := Result + EncodeChunk(Copy(Value, 0, 3));
Delete(Value, 1, 3);
end;
end;
********************************************
2. На мобильном клиенте
Считываю данные,
Function ReadData():string;
var
k, i : integer;
S:string;
begin
S:='';
K:=0;
i:=binsock.available;
if i=(-1) then
begin
... ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ
end ELSE if i<>0 then
BEGIN
K:=0;
repeat
while ((ConnectError=true) and (binsock.available<>0) and (chr(k)<>'@')) do
begin
k := binsock.read_byte;
if k=(-1) then
begin
... ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ
end else
if chr(k)<>'@' then S := S + chr(k);
end;
until ((ConnectError=false) or (chr(k)='@'));
END;
ReadData:=S;
end;
Разкодирую данные в utf с помощью библиотеки proweb
http://forum.boolean.name/showthread.php?t=8417
S:=base64_decode(S);
S:=encode(S, 'utf-8', 'ошибка');
P.S. Как правило работает на всех телефоннах