最近总是莫名奇妙的问题。delphi读utf-8编码格式文件

时间:2021-09-26 22:22:48
function  LoadUTF8File(AFileName: string): string;
var
  ffileStream:TFileStream;
  fAnsiBytes: string;
  S: string;
begin
  ffileStream:=TFileStream.Create(AFileName,fmOpenRead);
  SetLength(S,ffileStream.Size);
  ffileStream.Read(S[1],Length(S));
  fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));
  Result:= fAnsiBytes;
end;

这段代码用delphi7读utf-8编码的文件。大部分能读出来。但还是有?,其实?是有字符的。字符上下都有^这种东东。
为什么啊?

9 个解决方案

#1


没试过,不太清楚

#2


可能Copy截取时长度的问题

#3


你看下具体是哪个字符会出问题, UTF8Decode转出来的是widestring,也就是unicode编码,你要的是ansistring,是国标编码,这两种编码字符集不完全相同,有些字符utf8里有,但国标里没有,就会出现你说的这种情况

#4


和ascii字符串不兼容吧。

#5


引用 3 楼 skylkj 的回复:
你看下具体是哪个字符会出问题, UTF8Decode转出来的是widestring,也就是unicode编码,你要的是ansistring,是国标编码,这两种编码字符集不完全相同,有些字符utf8里有,但国标里没有,就会出现你说的这种情况


那我不转换成ansisring。我只是想把utf8的文字在memo里显示出来。
谁知道怎么做?

#6


fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));

改为

fAnsiBytes:= Copy(UTF8Decode(S), 4, MaxInt);

#7



function LoadUTF8File(AFileName: string): WideString;
var
  ffileStream:TFileStream;
  fAnsiBytes: WideString;
  S: string;
begin
  ffileStream:=TFileStream.Create(AFileName,fmOpenRead);
  SetLength(S,ffileStream.Size);
  ffileStream.Read(S[1],Length(S));
  fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));
  Result:= fAnsiBytes;
end;

 

#8


我现在只用D2010 

function LoadUTF8File(AFileName: string): String;
var
begin
  SS := TStringStream.Create('', TEncoding.UTF8);
  SS.LoadFromFile(AFileName);
  Result := SS.DataString;
end;

用字符串流

#9


我在网上看到说memo的组件显示utf8有些可能显示不出来。
fAnsiBytes:= Copy(UTF8Decode(S), 4, MaxInt);

这个转换还是不行。

2010能行是吗?

#1


没试过,不太清楚

#2


可能Copy截取时长度的问题

#3


你看下具体是哪个字符会出问题, UTF8Decode转出来的是widestring,也就是unicode编码,你要的是ansistring,是国标编码,这两种编码字符集不完全相同,有些字符utf8里有,但国标里没有,就会出现你说的这种情况

#4


和ascii字符串不兼容吧。

#5


引用 3 楼 skylkj 的回复:
你看下具体是哪个字符会出问题, UTF8Decode转出来的是widestring,也就是unicode编码,你要的是ansistring,是国标编码,这两种编码字符集不完全相同,有些字符utf8里有,但国标里没有,就会出现你说的这种情况


那我不转换成ansisring。我只是想把utf8的文字在memo里显示出来。
谁知道怎么做?

#6


fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));

改为

fAnsiBytes:= Copy(UTF8Decode(S), 4, MaxInt);

#7



function LoadUTF8File(AFileName: string): WideString;
var
  ffileStream:TFileStream;
  fAnsiBytes: WideString;
  S: string;
begin
  ffileStream:=TFileStream.Create(AFileName,fmOpenRead);
  SetLength(S,ffileStream.Size);
  ffileStream.Read(S[1],Length(S));
  fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));
  Result:= fAnsiBytes;
end;

 

#8


我现在只用D2010 

function LoadUTF8File(AFileName: string): String;
var
begin
  SS := TStringStream.Create('', TEncoding.UTF8);
  SS.LoadFromFile(AFileName);
  Result := SS.DataString;
end;

用字符串流

#9


我在网上看到说memo的组件显示utf8有些可能显示不出来。
fAnsiBytes:= Copy(UTF8Decode(S), 4, MaxInt);

这个转换还是不行。

2010能行是吗?