Delphi XE3 - 数据捕获 REST 服务器 UTF8 输出

3

我正在使用Delphi XE3实现REST服务。实际上是在访问:

var metaData: TDSInvocationMetadata;
metaData.ResponseContent:= output;

生成XML输出。不幸的是,经过数小时测试各种UTF8到Unicode转换方法后,我仍然无法获得正确的UTF8输出。以下是我的示例:

function TServerMethods1.UTF8TEST(Value: string): string;
 var metaData: TDSInvocationMetadata;
     output: String;
begin
  metaData:= GetInvocationMetadata;
  output:= '<element><inside name="skúška" /></element>';
  metaData.ResponseCode:= 200;
  metaData.ResponseContentType:= 'text/xml; charset=utf-8';
  metaData.ResponseContent:= utf8encode(output);
end;

在通过互联网浏览器调用后:http://localhost:8080/datasnap/rest/TServerMethods1/UTF8TEST,我收到了编码错误报告。将特殊字符'úš'删除并将名称设置为'skuska'后,一切似乎都正常了。
有人能帮忙如何正确获取UTF8编码输出吗?
1个回答

6

经过多个小时的测试和搜索,我终于找到了一种正确生成UTF8 XML输出的方法,使用Datasnap REST服务器:

Function StringToStream(const AString: string): TStream;
var utf8: utf8string;
begin
  utf8:= utf8encode(AString);
  Result:= TStringStream.Create(utf8);
end;

function TServerMethods1.UTF8TEST(Value: string): TStream;
var metaData: TDSInvocationMetadata;
    output: String;
begin
  metaData:= GetInvocationMetadata;
  output:= '<element><inside name="skúška" /></element>';
  metaData.ResponseCode:= 200;
  metaData.ResponseContentType:= 'text/xml; charset=utf-8';
  //metaData.ResponseContent:= output;
  result:= StringToStream(output);
end;

解决方案是使用TStream发送UTF8编码的字符串,而不是直接将其写入metaData.ResponseContent中(它始终是UNICODE - UTF16编码)...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接