Я разрабатываю сервер и мобильный клиент, которые обмениваются данными по HTTP. Сервер написан на Delphi 7 (потому что он должен быть совместим со старым кодом), клиент - мобильное приложение, написанное на XE6. Сервер отправляет клиенту поток данных, содержащий строки. Проблема связана с кодировкой.
На сервере я пытаюсь передать строки в UTF8:
//Writes string to stream
procedure TStreamWrap.WriteString(Value: string);
var
BytesCount: Longint;
UTF8: string;
begin
UTF8 := AnsiToUtf8(Value);
BytesCount := Length(UTF8);
WriteLongint(BytesCount); //It writes Longint to FStream: TStream
if BytesCount > 0 then
FStream.WriteBuffer(UTF8[1], BytesCount);
end;
Как написано в Delphi7, Value - это однобайтовая строка.
На клиенте я читаю строку в UTF8 и кодирую ее в Unicode
//Reads string from current position of stream
function TStreamWrap.ReadString: string;
var
BytesCount: Longint;
UTF8: String;
begin
BytesCount := ReadLongint;
if BytesCount = 0 then
Result := ''
else
begin
SetLength(UTF8, BytesCount);
FStream.Read(Pointer(UTF8)^, BytesCount);
Result := UTF8ToUnicodeString(UTF8);
end;
end;
Но это не работает, когда я показываю строку с ShowMessage
, буквы неправильные. Итак, как сохранить строку в Delphi 7 и восстановить ее в XE6 в мобильном приложении? Следует ли мне добавлять BOM в начало данных, представляющих строку?
AnsiToUTF8
возвращаетRawByteString
, но вы заставляете неявное преобразование обратно вstring
- person Sir Rufo   schedule 12.05.2014