Delphi и кодировка UTF8 для JSON
Делаю как-то так:
Привыкши извращаться в Delphi7 с TlkJSON, где символы перекодируются сразу и корректно, сейчас не могу врубиться, в какую сторону искать в этом направлении в D2010. Задницей чую, что есть какие-то конвертеры в Delphi, но в ней такой дебиловатый мануал, что вообще ничего не описывается и ничего в нём существенного нет.
Собственно вопрос: как преобразовывать в Delphi2010 ASCII в UTF8/Unicode?
И самое главное, никак не получается получить вот это, что делает JavaScript и PHP:
Так еще раз говорю - не надо AnsiString - надо String отдавать. В версиях выше 7 это разные типы.
Так еще раз говорю - не надо AnsiString - надо String отдавать. В версиях выше 7 это разные типы.
Вот я пишу код:
TmfAgregatorOneLogMessage = class(TmfLogMessage)
property MsgText: String read FMsgText write FMsgText;
public
property JSON: TJSONObject read GetJSON write SetJSON;
end;
function TmfAgregatorOneLogMessage.GetJSON: TJSONObject;
begin
Result := TJSONObject.Create;
try
with Result do
begin
.............
AddPair('MsgText', TJSONString.Create(MsgText));
end;
finally
end;
end;
{И где-то там ещё...}
........
var
Mess: TmfAgregatorOneLogMessage;
JS: UnicodeString;
.........
// Создаётся объект со строкой, которая написана вот тут в коде русскими буквами
// которое попадает в JSON в виде Ansi строки, а не Unicode как хочется
Mess := LError(Self, 'Сообщение русскими буквами');
JS := Mess.JSON.ToString;
MessStr := UTF8Encode('Строка русскими буквами');
showmessage(IntToStr(StringCodePage(UTF8Encode('Строка русскими буквами'))));
showmessage(IntToStr(StringCodePage(MessStr)));
Что же смерть не идёт, Захария?
S: UTF8String;
begin
S := 'Строка русскими буквами';
...
AddPair('MsgText', TJSONString.Create(S));
end;
...
AddPair('MsgText', TJSONString.Create(UTF8String('Строка русскими буквами')));
end;
MessStr := UTF8Encode('Строка русскими буквами');
showmessage(IntToStr(StringCodePage(UTF8Encode('Строка русскими буквами'))));
showmessage(IntToStr(StringCodePage(MessStr)));
Что же смерть не идёт, Захария?
Проблема решилась? Если да то объясните в кратце что служило источником проблемы и метод её устранения.
Я просто честно не понимаю от чего текут мозги. Вы объявили переменную типа UnicodeString(тот же string), потом вы переменной присваиваете результат функции UTF8Encode.
Но!!!
Результат функции UTF8Encode имеет тип RawByteString и не совпадает с типом переменной. Компилятор видит что допущена ошибка, но не начинает еб*ть бошку как с++, а просто исправляет её и сообщает об этом вот таким сообщением:
[DCC Warning] Unit1.pas(30): W1057 Implicit string cast from 'RawByteString' to 'string'
И в алертах всё верно.
В первом как вы и хотели преобразовано в RawByteString с кодовой страницей 65001(UTF-8)
Во втором после вашей конвертации студия для записи в переменную конвертит в юникод. А про юникод я гдето читал примерно следующее:
Переменные UnicodeString всегда помечены кодировкой 1200, при любом типе инициализации и присвоения.
а не то что я сейчас получаю, и что понимает только Delphi, да и то в виде кракозяблов.
...
Кстати если делфи после себя не может считать строку и выводит так называемые кракозяблы то должны были быть сообщения о неявном преобразовании типов(наподобии как в посте выше, но там указывается что возможна потеря данных) . Реагировать на это или нет решать программисту.
Freeman уже подсказал конструкцию которая должна работать.
Вы наверное видели в моих вопросах вот такие вещи:
Когда я переходил с D7 на D2010 это было настоящим убийством мозга. Но потом(с практикой) понимание приходит.
Проблема решилась удивительно просто: всё это сделал на XE2. Там не случилось этих кодировочных troubles в JSON. Я пока не смог понять как у них так это получается. Наверное совсем не гуру. Но буду думать об этом, может понимание придёт к старости.