2011-01-07 9 views
1

での作業次のすべての行を読み込み、セパレータ(タブ文字)で行を分割してメモリに保存する必要があります。ReadLnが、私はそう 、私はそれぞれの行は、単語とその量(数)を含んで、線でUTF-8のファイルの行を読み取る必要が私はデルファイ7</p> <p>を使用WideStringに(UTF-8ファイル)

ので、

1)DelphiでUTF-8のファイルを操作するためのライブラリは、多分(3-サードパーティ)

2があるが)関数は、WideStringにして[OK]を動作しますか?私はPosExを使用します。そうしないと、ワイドストリングを扱う第三者の図書館へのリンクを付けることもできますか?

+1

を参照してください。System.UTF8Decode() –

答えて

4

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

私は、UTF-8が通常「ワイド文字列」と呼ばれるとは思わない。私は間違っているかもしれませんが、通常はUTF-16を意味すると思います。

2

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

JCLには、実際に使用する必要がある場合、Unicodeを扱うためのさまざまな関数とクラスが付属しています。

1

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

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

AFAIKというタブ文字を探しているのであれば、単にAnsiStringを使うことができますが、探したい$ 80以上のバイトがマルチバイトシーケンスの一部でないことを保証する必要があります。もっと複雑な処理が必要な場合は、UTF-16文字列で動作するライブラリをUTF-8よりも見つけるほうが簡単かもしれません。 Rob Kennedyは次のように述べています。JCLは、UTFの文字列操作を実装するフリーライブラリとしての出発点です。

1

入力のほとんどがUTF-8の場合、起動時にコードページを「デフォルト」からutf8(コードページ65001)に変更すると、になる可能性があります。これにより、すべてのansistring-> widestring変換が効果的に無損失utf-8-> utf-16になります。

D7では、winapi -W機能をベースにした、いわゆる "ユニコード"コンポーネントが必要になります。 Delphi独自のコンポーネントは、デフォルトの文字列タイプをUTF-16に切り替える流域D2009リリースでのみ行います。

あなたが重くUnicodeサポートに投資したい場合は、アップグレードは、その後、そのLoadFrom ...()メソッドを経由して、通常のTStringListのに-あるとしてあなたは、単にファイルを読むことができ

0

を行うためのスマートなものになるかもしれません必要に応じてリストをループします。一度にファイル全体をメモリにロードすることはオプションではない場合は、TFileStreamを使用してファイルを開き、TStreamReader.ReadLine()メソッドを使用してストリームを行単位で読み取ることができます。

処理のためにUTF-8シーケンスをUTF-16にデコードする必要がある場合は、RTLのUTF8Decode()関数が壊れたUTF-8を持つため、Win32 APIのMultiByteToWideChar()関数を直接使用することをお勧めします古いDelphiのバージョンで実装されています(D7については不明ですが、それはD6ではっきりとしています)。

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

関連する問題