2

Microsoft レポート ツールを使用して作成されたテキスト ファイルがあります。テキスト ファイルにはBOM 0xFFFE、先頭に が含まれ、次にASCII文字間にヌルがある文字出力 (" F.i.e.l.d.1.") が含まれます。これを使用して、これを入力形式および出力形式として使用iconvするように変換できます...うまく機能します。UTF-8UCS-2LEUTF-8

私の問題は、UCS-2LEファイルから文字列に行単位で読み取り、フィールド値を解析してからASCIIテキスト ファイル (つまりField1 Field2) に書き出すことです。stringのおよびwstringベースのバージョンを試しましたgetline– ファイルから文字列を読み取る間、関数のような関数substr(start, length)は文字列を値として解釈する8-bitため、開始値と長さの値はオフです。

UCS-2LEデータをC++文字列に読み込み、データ値を抽出するにはどうすればよいですか? 私は数多くのグーグル検索と同様に見てきましたがboosticuうまくいくものは見つかりませんでした。ここで何が欠けていますか?助けてください!

私のコード例は次のようになります。

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.eg.e.n.e.r.a.l.i.t.i.e.s.

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

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

ありがとう!

4

2 に答える 2

1

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

  • UTF-16(または) ファイルの読み取りUCS2-LEは、明らかに C++11 で管理できます。Windows のファイルに UTF-8 でエンコードされた文字列を C++ で書き込む方法を参照してください。

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

  • ただし、古いコンパイラ (MSVC 2008 など) ではlocaleカスタムcodecvtファセット/「レシピ」を使用できます。

  • 別の方法として、この読み取り方法を試すこともできますが、私の場合はうまくいきませんでした。出力には、ガベージ文字に置き換えられた行がありません。

C++11 より前のコンパイラではこれを行うことができず、Ruby でスクリプトを作成し、プロセスを生成する必要がありました (テスト中なので、そのような複雑さは問題ないと思います)。仕事。

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

于 2013-03-13T12:23:04.920 に答える
0

substr は、g++ 4.3.3 を使用する Linux で問題なく動作します。プログラム

#include <string>
#include <iostream>

using namespace std;

int main()
{
  wstring s1 = L"Hello, world";
  wstring s2 = s1.substr(3,5);
  wcout << s2 << endl;
}

「lo、w」を出力します。

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

于 2009-08-09T05:54:02.763 に答える