您正在使用BytesOf()
,它使用OS默认的Ansi编码将UnicodeString
转换为字节数组。 TJSONObject::Parse()
更喜欢而不是UTF-8。它寻找一个UTF-8 BOM,如果没有找到,那么它不会对字节的编码作任何假设,它只会将它们视为8位字符。这在处理非ASCII字符时不起作用,您需要改用UTF-8。要将UnicodeString
转换为UTF-8编码的字节数组,你可以使用TEncoding::UTF8::GetBytes()
,但你必须在前面加上手动将UTF-8 BOM数组:
UnicodeString doc = L"{\"alias\":\"Test ЮРИСЛАВ\"}";
ShowMessage(doc);
TBytes bytes;
bytes.Length = 3 + TEncoding::UTF8::GetByteCount(doc);
bytes[0] = 0xEF;
bytes[1] = 0xBB;
bytes[2] = 0xBF;
TEncoding::UTF8::GetBytes(doc, 1, doc.Length(), bytes, 3);
TJSONObject* jo = new TJSONObject();
jo->Parse(bytes, 0);
ShowMessage(jo->ToString());
//...
delete jo;
话虽这么说,你应该直接使用静态TJSONObject::ParseJSONValue()
方法而不是TJSONValue::Parse()
。 ParseJSONValue()
甚至有一个接受UnicodeString
作为输入,将在内部转换为UTF-8编码的字节数组你过载:
UnicodeString doc = L"{\"alias\":\"Test ЮРИСЛАВ\"}";
ShowMessage(doc);
TJSONObject* jo = (TJSONObject*) TJSONObject::ParseJSONValue(doc);
ShowMessage(jo->ToString());
//...
delete jo;
但是,如果你确实需要在自己的字节数组通过,其他的ParseJSONValue()
重载允许您指定字节数组是否是UTF-8编码或不(它假定默认为UTF-8),所以你并不需要一个BOM:
UnicodeString doc = L"{\"alias\":\"Test ЮРИСЛАВ\"}";
ShowMessage(doc);
TJSONObject* jo = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::UTF8::GetBytes(doc), 0, true);
ShowMessage(jo->ToString());
//...
delete jo;
尝试使用'String' insted的的用于'doc'变量的'UnicodeString'或使用'UTF8Encode()'函数 – Marusyk
我做到了,但是结果相同 – kokokok