3

Unicode 文字または UTF8 文字が ansistring に存在する場合、文字列から文字を取り除くことは可能ですか? この特定のケースでは、ansistring に EXIF パラメータが含まれています。

編集

文字列を読み取ると、次のように表示されます: Copyright © 2013 The States of Guernsey (Guernsey Museums & Galleries)

ある場合、著作権記号 © は UTF-8 シーケンス (つまり、0xc2 と 0xa9) としてエンコードされます。Delphi 7 および Delphi 2010 では、ASCII として表示され、「Â」(C2)と「©」(A9)が表示され、UTF8 シーケンスは無視されます。Exif タグと Copyright タグ (33432) は、UTF8 や Unicode ではなく、単純な ASCII にする必要があります。

ansistring にこれらの文字が 1 つ以上含まれている場合、それらを文字列から削除できますか、それとも手動で編集する必要がありますか?

編集2

私が試したUTF8を回復しようとしています:

// 文字列から null ターミネータを削除します (imageen unit の一部} function RemoveNull(sValue: string): string; begin result := trim(svalue); if (result <> '') and (result[length(result) ] = #0) 次に SetLength(結果, 長さ(結果) - 1); 結果:= トリム(結果); 終了;

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 に答える