如何在 Delphi 2009 之前处理 UTF-8 和 ANSI 转换?

3
在Delphi 2009中,我们有:
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName,TEncoding.UTF8);
RichEdit1.Lines.SaveToFile(OpenDialog2.FileName,TEncoding.Unicode);    

如果我还没有TEconding,我该如何在Delphi 2006中实现这个功能呢?

是否有方法将较新的库传回那里?或者在Web上隐藏着解决方案?


2
我相信UTF8EncodeUTF8Decode在Delphi 2009之前就已经存在了。因此,您可以手动解码/编码字节字符串。 - Andreas Rejbrand
哇!兄弟,你真快啊!发表你的答案,因为那是正确的!!问题解决了。 - NaN
这些函数无法帮助复制TEncoding.Unicode,因为它是UTF-16。 - David Heffernan
4
为什么你使用UTF8,因为标准的RTF文件只能由7位ASCII字符组成(http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding)。 - mjn
我制作了一个创建文本文件的Android应用程序。但是这些文件是UTF8格式的。我又用Delphi制作了另一个应用程序来读取这些txt文件并执行某些操作,但它们必须采用默认的Delphi编码(我认为是ANSI),因此我需要在打开它们时进行解码。 - NaN
2个回答

6

我相信在Delphi 2009之前,UTF8EncodeUTF8Decode就已经存在了。因此,你可以手动解码/编码字节字符串。(我自己也这样做过。)


3
这是我Delphi 7项目中的一段代码片段:
function LoadFile(const fn: string): WideString;
var
  f:TFileStream;
  src:AnsiString;
  wx:word;
  i,j:integer;
begin
  if FileExists(fn) then
   begin
    f:=TFileStream.Create(fn,fmOpenRead or fmShareDenyNone);
    try
      f.Read(wx,2);
      if wx=$FEFF then
       begin
        //UTF16
        i:=(f.Size div 2)-1;
        SetLength(Result,i);
        f.Read(Result[1],i*2);
        //detect NULL's
        for j:=1 to i do if Result[j]=#0 then Result[j]:=' ';//?
       end
      else
       begin
        i:=0;
        if wx=$BBEF then f.Read(i,1);
        if (wx=$BBEF) and (i=$BF) then
         begin
          //UTF-8
          i:=f.Size-3;
          SetLength(src,i);
          f.Read(src[1],i);
          //detect NULL's
          for j:=1 to i do if src[j]=#0 then src[j]:=' ';//?
          Result:=UTF8Decode(src);
         end
        else
         begin
          //assume current encoding
          f.Position:=0;
          i:=f.Size;
          SetLength(src,i);
          f.Read(src[1],i);
          //detect NULL's
          for j:=1 to i do if src[j]=#0 then src[j]:=' ';//?
          Result:=src;
         end;
       end;
    finally
      f.Free;
    end;
   end
  else
    Result:='';
end;

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