провел тест на 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.debug_register(1);
binsock.enable_debug(1);
результат тот же, ошибок нет. после получения русских "вопросиков" мидлет продолжает работать. вот исходник теста: (в первом тесте процедуры onerror не было)
program testscr;
uses
binsock;
var
IsConn, l : integer;
rx: string;
b: integer;
res: resource;
cmOK: command;
procedure onerror(sender:Integer;exception:string;errstr:string;code:integer);
begin
cmOK:= CreateCommand('OK',CM_OK,1);
ShowAlert('Error #'+IntegerToString(code),'Exception: '+exception+chr(10)+chr(13)+'ErrorString: '+errstr, LoadImage('/icon.png'),ALERT_ERROR);
repeat delay(200);
until getClickedCommand = cmOK;
end;
procedure clr;
begin
showCanvas;
setFont(FONT_FACE_SYSTEM, 0, FONT_SIZE_SMALL);
SetColor(0,0,0);
fillRect(0,0, getwidth, getheight);
SetColor(0,255,0);
end;
procedure txt(s: string; y: integer;);
begin
drawtext(s, 5, y);
repaint;
end;
begin
// scr
clr;
// сокеты
binsock.debug_register(1);
binsock.enable_debug(1);
// connect
IsConn:= binsock.open( 'socket://xxxx:2286' );
delay(3000);
if IsConn=1
then txt('connected!', 10)
else halt;
// loop
repeat
rx:= '';
// read sock
l:= binsock.available;
while l>0 do begin
rx:= rx + binsock.read_bin(l);
l:= binsock.available;
end;
// show
l:= length(rx);
if l>0 then begin
clr;
txt( integertostring(GetCurrentTime), 10 );
txt( 'rx len='+IntegerToString(l), 30 );
txt( rx, 50 );
end;
delay(100);
until GetKeyPressed <> KE_NONE;
end.
отправка с сервера в сокет выглядела так (delphi 2007):
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
us: UTF8String;
begin
us:= AnsiToUtf8( Edit1.Text );
for i:= 0 to ServerSocket1.Socket.ActiveConnections-1 do
if CheckBox1.Checked then // птичка "отправлять в utf-8"
ServerSocket1.Socket.Connections[i].SendText( us )
else
ServerSocket1.Socket.Connections[i].SendText( Edit1.Text );
end;
продолжил тесты:
функция binsock.read_byte возвращает именно байты. если пришел ansi - получим именно их коды, utf - по два байта на каждую русскую букву.
то есть засада в функции binsock.read_bin() - мне кажется, когда присваивается результат, NOKIA и LG воспринимают это по-разному: нокиа строго раскладывает побайтно, lg в этом потоке бинарных данных рассматривает utf8 символы и преобразует находу. можно ли и NOKIA заставить "распознавать" строку UTF-8 ?