2


0

UCS-2LEテキストファイルの解析

マイクロソフトのレポート作成ツールを使用して作成されたテキストファイルがあります。 テキストファイルは最初に BOM、` 0xFFFE`、それから文字の間にヌル文字を含む ASCII`文字を出力します(すなわち" F.i.e.l.d.1 ")。 `iconv`を使ってこれを UCS-2LE`を入力フォーマットとして UTF-8`を出力フォーマットとして UTF-8`に変換することができます。 それは素晴らしい作品です。

私の問題は、 UCS-2LE`ファイルから文字列に行を読み込み、フィールドの値を解析して、それを ASCII`テキストファイルに書き出したいということです。 Field1 Field2)。 string`と wstring`ベースの getline`を試してみました - ファイルから文字列を読み込んでいる間、 substr(start、length) のような関数は文字列を 8-bit`値として解釈します、したがって、開始値と長さの値はオフです。

UCS-2LE`データを C`文字列に読み込んでデータ値を取り出すにはどうすればいいの? 私は boost`と icu`、そして多数のグーグル検索を見てきましたが、うまくいくものは何も見つかりませんでした。 私はここで何が足りないのですか? 助けてください!

私のサンプルコードは次のようになります。

wifstream srcFile;
srcFile.open(argv[1], ios_base::in | ios_base::binary);
..
..
wstring  srcBuf;
..
..
while( getline(srcFile, srcBuf) )
{
    wstring field1;
    field1 = srcBuf.substr(12, 12);
    ...
    ...
}

したがって、たとえば、 srcBuf`に" `W.e.が含まれているとします。 t.h.i.n.k i.n. "g.e.n.e.r.a.l.i.t.i.e.s.`"すると上記の `substr()`は ` .kを返します。 i.n. "g.e.n.e.r.a.l.i.t.i.e.s."の代わりにg.e "

私が欲しいのは、文字列を読み込み、マルチバイト表現を気にせずにそれを処理することです。 誰かがファイルからこれらの文字列を読み込んで内部使用のためにそれらを固定幅の表現に変換するのに boost(あるいは何か他のもの)を使う例を持っていますか?

ところで、私はMac上でEclipseとgccを使っています。 私の `STL`がワイド文字列を理解できない可能性はありますか?

ありがとうございます。

2 Answer


1


この質問に取り組むためにかなりの時間を費やしたので、これが私の結論です。

  • + UTF-16 +(または + UCS2-LE +)ファイルの読み取りは明らかに管理しやすい C 11では、https://stackoverflow.com/questions/3973582/how-do-i-write-a-utf-8-encoded-string-to-a-file-in-windows-in-cを参照してください[WindowsのC でUTF-8エンコードされた文字列をファイルに書き込む方法]

  • `+ boost :: locale `ライブラリは現在C + 11の一部であるため、 `+ codecvt_utf16 +`を使用します(最終的なコードサンプルについては、以下の箇条書きを参照してください)。

  • しかし、古いコンパイラでは(例えば MSVC 2008)、「+ locale +」を使用できます https://stackoverflow.com/a/208431/132735 [この回答] https://stackoverflow.com/questions/207662/writing- utf16-to-file-in-binary-mode / [バイナリモードでファイルにUTF16を書き込む]

  • または、試すこともできます http://cfc.kizzx2.com/index.php/reading-a-unicode-utf16-file-in-windows-c/ [この方法]を読んでいますが、私の場合はうまくいきませんでした。 出力には、ガベージ文字に置き換えられた行が欠落しています。

私はC 11以前のコンパイラでこれを実現することができず、私のタスクを実行するためにRubyでそれをスクリプトにしてプロセスを生成することに頼らなければなりませんでした。

これが他の人に時間をかけずに助けてくれることを願っています。


0


substrはLinux上ではg 4.3.3を使えば問題なく動作します。 プログラム

#include #include

名前空間stdを使用する。

int main(){wstring s1 = L "こんにちは、ワールド"; wstring s 2 = s 1.substr(3,5); wcout << s2 << endl; }

必要に応じて "lo、w"を出力します。

しかし、ファイルの読み込みはおそらくあなたが期待しているものとは異なる何かをする。 ファイルをロケールのエンコーディングからwchar_tに変換します。これにより、各バイトが独自のwchar_tになります。 標準ライブラリがwchar_tへのUTF-16の読み込みをサポートしているとは思いません。