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

Delphi unicode或UTF8字符可以从ansistring中删除吗?,delphi,delphi-2010,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或unicod

如果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:

//从字符串(imageen单元的一部分)中删除空终止符} 函数RemoveNull(sValue:string):string; 开始 结果:=微调(S值); 如果(结果“”)和 (结果[长度(结果)]=#0)然后 设置长度(结果),长度(结果)-1; 结果:=修剪(结果); 结束

EXIF_版权:由ImageEn定义为AnsiString; utf8:utf8字符串

// 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_版权是一种转让


但这不会编译…

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

如果愿意,您可以指定一个AnsiString,但我不明白您为什么要这样做。如果您转换为ANSI,任何无法表示的字符都将转换为问号。如果您非常想去除非ASCII字符,请读入UTF8String,转换为string,然后去除字符>127

据我所知,标准要求使用ASCII码,但现在使用UTF-8对EXIF文本进行编码是很常见的

我建议您只需将文本读入UTF8字符串,并保持不变

您的库为您提供了一个实际包含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;

现在,您将看到文件创建者希望您看到的文本。

如果其解析无法访问所有字符?在这种特殊情况下,EXIF值由ImageEn读取,并且所有EXIF标记都应为简单的ASCII,而不是UTF8或unicode。@Bill Reality看起来与您的预期不同。现实是真实的世界d应用程序将UTF-8编码的文本放入EXIF字段。您也可以按照流程进行操作。如果您非常想去除非ASCII字符,请读入UTF8String,转换为string,并去除大于127的字符。对于ImageEn,无法使用UTF8String…ImageEn EXIF函数使用AnsiString。因此,看起来标签必须手动编辑d我猜。@David…请看我的编辑…如果我是哑巴,对不起,我在这里没有UTF8的经验。你的代码编译是因为类型错误。你的变量是什么类型。还有,_EXIF_Copyright:result:=RemoveNull(EXIF_Copyright);该做什么?