3

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

编辑

当字符串被读取时,它会显示为:版权所有 © 2013 The States of Guernsey (Guernsey Museums & Galleries)

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

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

编辑2

试图恢复我试过的UTF8:

// 从字符串中删除空终止符(图像单元的一部分} function RemoveNull(sValue: string): string; begin result := trim(svalue); if (result <> '') and (result[length(result) ] = #0) 然后 SetLength(result, length(result) - 1); result := trim(result); end;

EXIF_Copyright:由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_Copyright 是一个 ansistring;

但这不会编译...

4

1 回答 1

3

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

如果需要,您可以分配给 AnsiString,但我不明白您为什么要这样做。如果您确实转换为 ANSI,则任何无法表示的字符都将转换为问号。如果您急于去除非 ASCII 字符,请读入 UTF8String,转换为字符串,然后去除大于 127 的字符。

据我了解,标准要求使用 ASCII,但现在 EXIF 文本使用 UTF-8 编码很常见。

我建议您只需将文本读入 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;

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

于 2013-05-10T18:12:33.560 回答