3

私はdelphi7を使用しています。

utf-8ファイルを1行ずつ読み取る必要があります。各行には単語とその重み(数値)が含まれているため、次のすべての行を読み取り、行を区切り文字(tab char)で分割して、これをメモリに保存する必要があります。 。

それで、

1)Delphiでutf-8ファイルを操作するためのライブラリはありますか(サードパーティの可能性があります)

2)関数はワイドストリングで正常に動作しますか?PosExを使用しています。それで、そうでない場合は、ワイドストリングを操作するためのサードパーティライブラリへのリンクも提供できますか?

4

5 に答える 5

4

扱っているのが本当に UTF-8 である場合、それらを読み取って処理する限り、特別なことは何も必要ありません。それらを pchar または通常の Delphi 7 文字列として扱うことができるはずです。ある種のメッセージ ボックスに内容を表示しようとする場合、何らかの変換が必要になる場合があります。たとえば、文字列に 127 (0x7f) を超えるバイト値が含まれている場合、Delphi 7 メッセージ ボックス メソッドが UTF-8 文字列を正しく表示するとは思えません。そのような場合は、UTF-16 に変換して Windows API MessageBoxW などを呼び出す必要があります。それ以外の場合、UTF-8 文字列は、多くの状況で 1 バイトの ANSI 文字列と同じように扱うことができます。

通常、UTF-8 が「ワイドストリング」と呼ばれるとは思いません。間違っているかもしれませんが、通常は UTF-16 を意味すると思います。

于 2011-01-07T21:23:10.360 に答える
2

ファイルが UTF-8 でエンコードされていて、探している文字が ASCII の場合は、使用する必要はまったくありませんWideString。ASCII は UTF-8 のサブセットであり、ASCII 文字は UTF-8 の他の文字に使用される特別なエンコーディングに干渉しないことが保証されています。数字0から9タブまでの文字はすべて ASCII です。

JCLには、Unicode を処理するためのさまざまな関数とクラスが付属しています (それらを本当に使用する必要がある場合)。

于 2011-01-07T21:26:38.447 に答える
1

入力のほとんどが UTF-8 である場合、起動時にコードページを「デフォルト」から utf8 (コードページ 65001) に変更する価値があるかもしれません。これにより、すべての ansistring->widestring 変換が事実上ロスレス utf-8->utf-16 になります。

D7 では、一連のいわゆる「ユニコード」コンポーネント、つまり winapi -W 関数に基づくコンポーネントが必要になります。Delphi 独自のコンポーネントは、デフォルトの文字列型を UTF-16 に切り替える分水界 D2009 リリースでのみこれを行います。

Unicode サポートに多額の投資をしたい場合は、アップグレードするのが賢明かもしれません

于 2011-01-08T00:13:36.083 に答える
1

WideString は UTF-16 実装 (COM BSTR 互換のもの) であり、UTF-8 文字列を格納できません。8 ビット文字列を割り当てると、UTF-16 に変換されます。ただし、適切な変換関数を明示的に使用しない限り、Delphi は現在のコードページを使用して 8 ビット文字列を解釈します。

UTF-8 文字列は Delphi AnsiString(Delphi 7 のデフォルトの文字列型)に格納できますが、文字列操作関数は UTF-8 ではなく ANSI コードページ用に設計されています。違いは、UTF-8 がマルチバイト文字セットであることです。ただし、最初の 127 個の ANSI 文字は、特定の「文字」をエンコードするために 1 バイト以上が必要ですが、多くの ANSI コードページ (特にヨーロッパ言語用のもの) は 1 バイトしか必要とせず、255 個の「文字」のみをエンコードします (一方、UTF-8 はエンコードできます)。 Unicode セット全体)。

タブ文字を探しているだけの場合は、単純に AnsiString を使用できますが、探す必要のある $80 を超えるバイトがマルチバイト シーケンスの一部ではないことを確認する必要があります。より複雑な処理が必要な場合は、UTF-8 よりも UTF-16 文字列で動作するライブラリを見つける方が簡単かもしれません。Rob Kennedy が言ったように、JCL は UTF 文字列操作を実装する無料のライブラリとして良い出発点です。

于 2011-01-07T22:02:19.337 に答える
0

LoadFrom...() メソッドを使用してファイルをそのまま通常の TStringList に読み込み、必要に応じてリストをループするだけです。一度にファイル全体をメモリにロードできない場合は、TFileStream を使用してファイルを開き、TStreamReader.ReadLine() メソッドを使用してストリームを 1 行ずつ読み取ることができます。

処理のために特定の UTF-8 シーケンスを UTF-16 にデコードする必要がある場合は、Win32 API MultiByteToWideChar() 関数を直接使用することをお勧めします。これは、RTL の UTF8Decode() 関数の UTF-8 実装が古い Delphi で壊れているためです。バージョン(D7についてはわかりませんが、D6では間違いなくそうです)。

どちらの読み込み方法の良い点も、D2009 以降ではどちらもエンコーディングに対応していることです。つまり、アップグレードする場合は、データが UTF-8 であることを RTL に伝えるために、いくつかの非常に小さなコード変更を行うことができます。自動的に UTF-16 にデコードされ、残りの処理コードは同じままでかまいません (Ansi 固有のことを何もしていないと仮定します)。

于 2011-01-09T09:17:11.833 に答える