2 回答
FreePascal 字符串不像在 Delphi 2009+ 中那样采用 UTF-16 编码。在 FreePascal 和 Delphi 2007 及更早版本中,您的代码需要考虑实际的字符串编码。这就是 Indy 为这些平台公开其他基于 Ansi 的参数/属性的原因。
当TIdHTTPServer
写出ContentText
usingTIdIOHandler.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;
在现代 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