2
4

2 回答 2

5

FreePascal 字符串不像在 Delphi 2009+ 中那样采用 UTF-16 编码。在 FreePascal 和 Delphi 2007 及更早版本中,您的代码需要考虑实际的字符串编码。这就是 Indy 为这些平台公开其他基于 Ansi 的参数/属性的原因。

TIdHTTPServer写出ContentTextusingTIdIOHandler.Write()时,该ASrcEncoding参数不会在非 Unicode 平台上使用,因此您将不得不使用该TIdIOHandler.DefAnsiEncoding属性来Write()告知 the 的编码ContentText是什么,例如:

procedure TMyServer.DoCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
const
  UNI: WideString = '中文';
begin
  AResponseInfo.ContentText := UTF8Encode('<html>' + UNI + '</html>');
  AResponseInfo.ContentType := 'text/html';

  // this tells TIdHTTPServer what to encode bytes to during socket transmission
  AResponseInfo.CharSet := 'utf-8';

  // this tells TIdHTTPServer what encoding the ContentText is using
  // so it can be decoded to Unicode prior to then being charset-encoded
  // for output. If the input and output encodings are the same, the
  // Ansi string data gets transmitted as-is without decoding/reencoding...
  AContext.Connection.IOHandler.DefAnsiEncoding := IndyUTF8Encoding;
end;

或者,更一般地说:

{$I IdCompilerDefines.inc}

procedure TMyServer.DoCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
const
  UNI{$IFNDEF STRING_IS_UNICODE}: WideString{$ENDIF} = '中文';
begin
  {$IFDEF STRING_IS_UNICODE}
  AResponseInfo.ContentText := '<html>' + UNI + '</html>';
  {$ELSE}
  AResponseInfo.ContentText := UTF8Encode('<html>' + UNI + '</html>');
  {$ENDIF}
  AResponseInfo.ContentType := 'text/html';
  AResponseInfo.CharSet := 'utf-8';
  {$IFNDEF STRING_IS_UNICODE}
  AContext.Connection.IOHandler.DefAnsiEncoding := IndyUTF8Encoding;
  {$ENDIF}
end;
于 2013-04-11T17:59:03.277 回答
0

在现代 FreePascal 中,字符串默认为 UTF-8,除非您调整了编译器选项。

因此,它iif(ASrcEncoding, FDefAnsiEncoding, encOSDefault);的值似乎encOSDefault是错误的。如果您愿意,您可以在 INDY 源中修复它的检测,或者我猜最好设置DefAnsiEncoding := 'utf-8';(RFC AFAIR 的小写)

为了安全起见,您可以在程序开始时检查 UTF-8 模式。设置一些非拉丁语常量(比如那个中文的东西,或者希腊语或西里尔字母 - 随便)并检查它是否是 UTF8: http: //compaspascal.blogspot.ru/2009/03/utf-8-automatic-detection。 html

但是总的来说,我认为您可能会尝试找到一些比 Indy 更关心 FPC 和 Linux 的库。在我看来,Indy 似乎停滞不前,甚至在 Delphi 上也几乎被抛弃。也许(查找 DataSnap 性能测试文章)可以帮助您或发行版Synopse mORMot附带的一些库。CodeTyphon

于 2013-04-11T14:36:22.363 回答