您正在使用BytesOf(),它使用操作系统默认的 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;