如果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;
但这不会编译...
答案 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;
现在您将获得文件创建者希望您查看的文本。