可以从ansistring中删除unicode或UTF8字符吗?

时间:2013-05-10 16:48:12

标签: delphi delphi-2010

如果ansistring中存在Unicode字符或UTF8字符,是否可以从字符串中删除字符?在这种特殊情况下,ansistring包含EXIF参数。

修改

当字符串被读取时,它显示为:版权所有©2013根西岛国家(根西岛博物馆和画廊)

在一种情况下,版权符号©被编码为UTF-8序列(即0xc2和0xa9)。 Delphi 7和Delphi 2010将其显示为ascii,显示“”(C2)和“©”(A9),忽略它是UTF8序列。 Exif标签和版权标签(33432)应该是简单的ASCII,而不是UTF8或unicode。

因此,如果ansistring包含一个或多个这些字符,它们是否可以从字符串中删除,还是必须手动编辑?

EDIT2

试图恢复我试过的UTF8:

//从字符串中删除null终止符(imageen unit的一部分) function RemoveNull(sValue:string):string; 开始   结果:= trim(svalue);   if(结果<>'')和     (结果[length(result)] =#0)然后     SetLength(结果,长度(结果) - 1);   结果:= trim(结果); 端;

EXIF_Copyright:由ImageEn定义为AnsiString;   utf8:UTF8String;

// EXIF_Copyright
// Shows copyright information
SetLength(utf8, Length(EXIF_Copyright)); // [DCC Error] iexEXIFRoutines.pas(911): E2026 Constant expression expected
Move(Pointer(EXIF_Copyright)^, Pointer(utf8)^, Length(EXIF_Copyright)));
_EXIF_Copyright: result := RemoveNull(EXIF_Copyright);

不幸的是,我对处理UTF8的经验不多。

其中EXIF_Copyright是ansistring;

但这不会编译...

1 个答案:

答案 0 :(得分:2)

最简单的方法是将UTF-8字符串读入UTF8String类型的变量,然后分配给另一个字符串变量。

如果需要,您可以分配给AnsiString,但我不明白为什么要这样做。如果转换为ANSI,则任何无法表示的字符都将转换为问号。如果您不顾一切地去除非ASCII字符,请读入UTF8String,转换为字符串,并删除字符> 127。

据我所知,标准规定了ASCII,但现在常见的是用UTF-8编码EXIF文本。

我建议您只需将文本读入UTF8String并保留即可。

你的库为你提供了一个实际包含UTF-8文本的AnsiString。所以你可以像这样简单地转换为UTF8String:

function ReinterpUTF8storedInAnsiString(const ansi: AnsiString): string;
var
  utf8: UTF8String;
begin
  SetLength(utf8, Length(ansi));
  Move(Pointer(ansi)^, Pointer(utf8)^, Length(ansi));
  Result := utf8;
end;

现在您将获得文件创建者希望您查看的文本。