【问题标题】:Can a unicode or UTF8 character be stripped from a ansistring?可以从 ansistring 中剥离 unicode 或 UTF8 字符吗?
【发布时间】:2013-05-05 10:12:56
【问题描述】:

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

// 从字符串中删除空终止符(图像单元的一部分} 函数 RemoveNull(sValue: string): string; 开始 结果:=修剪(svalue); 如果(结果'')和 (结果[长度(结果)] = #0) 然后 SetLength(结果,长度(结果) - 1); 结果:=修剪(结果); 结束;

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;

但这不会编译...

【问题讨论】:

  • 如果它的 ansistring 不能访问所有字符?

标签: delphi delphi-2010


【解决方案1】:

最简单的方法是将 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;

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

【讨论】:

  • 在这种特殊情况下,EXIF 值由 ImageEn 读取,并且所有 EXIF 标记都应该是简单的 ASCII,而不是 UTF8 或 unicode。
  • @Bill Reality 看起来与您的预期不同。现实情况是,现实世界的应用程序将 UTF-8 编码的文本放入 EXIF 字段。你也可以随波逐流。如果您急于去除非 ASCII 字符,请读入 UTF8String,转换为字符串,然后去除大于 127 的字符。
  • ImageEn 不能使用 UTF8String... ImageEn EXIF 函数使用 AnsiString。所以看起来标签必须手动编辑我猜。
  • @David...查看我的编辑...抱歉,如果我在这里很笨,我没有使用 UTF8 的经验。
  • 您的代码编译是因为类型错误。你的变量是什么类型。另外,什么是 _EXIF_Copyright: result := RemoveNull(EXIF_Copyright);打算做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多