如何让Delphi和Android使用相同的字符集?

时间:2011-08-29 12:06:56

标签: android delphi character-encoding

我正在为一个问卷调查做一个项目。用户使用Delphi上的问题创建项目,而不是将.txt文件中的项目导出到Android,在那里读取文件并且用户可以回答。我的问题是á,à,É,Ú等字符,看起来像?在Android中,代码为65533.所以,我需要知道如何配置Android和Delphi在同一个字符集中工作。

2 个答案:

答案 0 :(得分:8)

Android基于Linux,因此可能使用UTF-8。另一方面,Android也非常类似于Java,因此可能更喜欢UTF-16。


如果您需要该文件为UTF-8,则可以这样做,假设您的文字位于TStringList

StringList.SaveToFile(FileName, TEncoding.UTF8);

这将包含文件中的BOM,我认为Android不会喜欢--Windows UTF-8应用程序倾向于使用BOM,而不是Linux。如果您想在没有BOM的情况下输出,请执行以下操作:

type
  TUTF8EncodingNoBOM = class(TUTF8Encoding)  
  public
    function GetPreamble: TBytes; override;
  end;

function TUTF8EncodingNoBOM.GetPreamble: TBytes;
begin
  Result := nil;
end;
...
var
  UTF8EncodingNoBOM: TEncoding;//make this a global variable
...
UTF8EncodingNoBOM := TUTF8EncodingNoBOM.Create;//create in a unit initialization, remember to free it
...
StringList.SaveToFile(FileName, UTF8EncodingNoBOM);

如果您发现需要UTF-16,则使用TEncoding.Unicode表示UTF-16LE,或TEncoding.BigEndianUnicode表示UTF-16BE。如果您需要剥离BOM,那么使用与上述相同的技术就足够了。

<强>摘要

  1. 确定您需要的编码及其字节顺序。
  2. 找到合适的TEncoding
  3. TStrings.SaveToFileTEncoding实例一起使用。

答案 1 :(得分:2)

使用Unicode。 UTF-16或UTF-8应该可以正常工作。

请参阅戴维斯的答案,了解为什么这应该有效以及如何在D2009及更新版本中进行解释。

对于Delphi 2007及更早版本,您必须使用另一种解决方案,可以使用UTF8Encode + Ansi TStringList,您也可以将字符串转换为WideStrings并使用WideStrings。

要使用D2007及更早版本编写UTF-8,请参阅此问题:

How can a text file be converted from ANSI to UTF-8 with Delphi 7?

要使用D2007编写UTF-16,您可以使用包含WideStrings的{​​{1}}单元。请注意,默认情况下,此类不会写入BOM。

对于较旧的Delphi版本,还有其他WideStringList实现。