-2

これは、テキスト入力ファイルの Unicode 文字に関する質問です。この議論は近いものでしたが、完全な答えではありませんでした。VS2008 でコンパイルされ、Windows で実行されると、これらの文字は読み取り時に認識されます (別のシンボルとして表されますが、読み取られる可能性があります) - g++ でコンパイルされ、Linux で実行されると、空白として表示されます。

‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ

残りの Unicode 記号は正常に機能しているように見えます。すべてをチェックしたわけではありませんが、このセットは機能しないことがわかりました。

質問: (1) なぜですか? (2) 解決策はありますか?

void Lexicon::buildMapFromFile(string filename )  //map
{
    ifstream file;
    file.open(filename.c_str(), ifstream::binary);
    string wow, mem, key;
    unsigned int x = 0;

    while(true) {
        getline(file, wow);
        cout << wow << endl;
        if (file.fail()) break; //boilerplate check for error
        while (x < wow.length() ) {
            if (wow[x] == ',') { //look for csv deliniator
                key = mem;
                mem.clear();
                x++; //step over ','
            } else 
                mem += wow[x++];
        }

        //cout << mem << " code " << key << " is " << (key[0] - '€') << " from €" << endl;

        cout << "enter 1 to continue: ";
        while (true) {
            int choice = GetInteger();
            if (choice == 1) break;
        }

        list_map0[key] = mem; //char to string
        list_map1[mem] = key; //string to char
        mem.clear(); //reset memory
        x = 0;//reset index
    }
    //printf("%d\n", list_map0.size());
    file.close();
}

Unicode シンボルは csv ファイルから読み取られ、Unicode シンボルと関連する文字列が解析されます。最初はコードにバグがあると思っていましたが、この投稿では問題がないことがわかり、文字がどのように処理されるかについて問題を追跡しました。

テストはcout << wow << endl;

4

3 に答える 3

1

表示される文字はすべて、ISO-88591エンコーディングには存在しないWindowsコードページ1252の文字です。これらの2つのエンコーディングは類似しているため、混同されることがよくあります。

入力がCP1252であり、ISO-8859 1であるかのように読み取っている場合、それらの文字は制御文字として読み取られ、通常の表示文字としては動作しません。


これを引き起こすために間違って行う可能性のあることはたくさんありますが、どれを決定するために詳細を投稿する必要があります。より完全な答えを得るには、データの読み取り方法、データの内部変換と保存方法、読み取りデータのテスト方法、入力データやエンコードについて知る必要があります。


表示されたコードはデータの読み取り中に変換を行わず、データを印刷するためのコメントアウトされたコードは同じです。変換はありません。これは、プログラムを実行するプラットフォームに対して正しい入力データに依存しているデータを印刷することを意味します。つまり、たとえば、Windowsのコンソールでプログラムを実行する場合、入力ファイルはコンソールのコードページ*を使用してエンコードする必要があります。

問題を解決するには、次のいずれかを行うことができます。入力ファイルが、プログラムを実行する特定のコンソールに必要なエンコーディングと一致していることを確認してください。または、入力エンコーディングを指定し、読み取り時に既知の内部エンコーディングに変換してから、印刷時にコンソールエンコーディングに変換します。

*そうでない場合、たとえば、コンソールがcp437で、ファイルがcp1252の場合、リストした文字は代わりに次のように表示されます。ÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñ Ѫº¿⌐¬½¼¡«»

于 2013-01-14T19:09:25.427 に答える
0

C++ コードでの Unicode 処理は単純ではなく、実装に依存します (VS2008 と g++ の間で出力が変化することは既に確認しました)。さらに、Unicode はさまざまな文字エンコーディング (UTF-8 や UTF-16 など) で実装できます。

この ページ に啓発 記事 があります. STL ベースのソフトウェアの Unicode 変換について説明しています。テキスト I/O の主な武器はcodecvtです。これは、異なる文字エンコーディング システム間で文字列を変換するために使用できるライブラリ関数です。

于 2013-01-14T18:59:58.740 に答える
0

あなたの問題ステートメントはg ++のプラットフォームを詳しく説明していませんが、タグから、Linuxで同じコードをコンパイルしているようです。

Windows と Linux はどちらも Unicode 対応です。そのため、windows/vs-2008 のコードに wstring クラスが含まれていた場合、linux/g++ では文字列に戻す必要があります。Linux で wstring を使用している場合、同じようには機能しません。

于 2013-01-14T18:54:49.060 に答える