【问题标题】:Delphi XE3 - datasnap REST server UTF8 outputDelphi XE3 - datasnap REST 服务器 UTF8 输出
【发布时间】:2015-04-28 16:50:54
【问题描述】:

我正在 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”后,evrythink 似乎没问题。

任何人都可以帮助如何获得正确的 UTF8 编码输出???

【问题讨论】:

    标签: rest delphi utf-8 delphi-xe3 datasnap


    【解决方案1】:

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

    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 编码的)...

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多