テキスト(ASCII +ユニコード)を含むファイルがあり、C++プログラムを使用してその中の総単語数をカウントしようとしています。私がファイルを行ごとに(getline
を使用して)読み、その中の単語を数えるために各行を処理する必要があります。C++:ユニコード空白文字の解釈
は、だから私は、次の簡単なプログラム書かれている:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main(int argc, char* argv[]) {
uint64_t ct = 0;
std::string line;
std::ifstream infile(argv[1]);
while(std::getline(infile, line)) {
std::stringstream inputStream(line);
std::string token;
while (inputStream >> token) {
++ct;
}
}
std::cout << ct << std::endl;
return 0;
}
をしかし、上記のプログラムはwc -w
コマンドが与えるものよりも小さいです番号を出力します。問題を絞り込むために、プログラムを変更して、読み込んだものを単純に出力するようにしました。プログラムは次のようになります:
int main(int argc, char* argv[]) {
uint64_t ct = 0;
std::string line;
std::ifstream infile(argv[1]);
while(std::getline(infile, line)) {
std::stringstream inputStream(line);
std::string token;
while (inputStream >> token) {
std::cout << token << " ";
}
std::cout << std::endl;
}
return 0;
}
このプログラムの出力を別のファイルにリダイレクトしました。この新しいファイルでwc -w
を実行すると、番号は元のファイルのwc -w
と同じになります。つまり、自分のプログラムですべての単語(つまり、wc
で定義されている「単語」)を読み込んでいます。したがって、を使用して読み取られるtoken
の値の1つが、wc
プログラムによって空白として解釈されるいくつかのユニコード文字で構成されていることが合理的な説明となります。どうすれば私のプログラムを変更して、ユニコードの空白文字のそのような解釈をサポートすることができますか?
にvant。 Boostはこれをルックアップテーブルとして実装し、各文字を特定の型にマップし、ヒューリスティックスで型をチェックします。基本的には、BoostやQtのようなまともなUnicodeサポートが必要か、気にしないでください。 http://www.boost.org/doc/libs/1_62_0/boost/spirit/home/support/char_encoding/unicode。hpp –
興味のある場合は、UnicodeテキストをUTF-32(開始バイトか継続バイトかプレーンASCIIかを確認する)に変換し、コードポイントを調べて、参照を使用して空白かどうかを確認しますテーブルを作成し、それをトークンとして使用します。 これが関係していると思いますが、それは大変な作業です。ブーストは特に顕著です。 –
Unicodeにはかなりのスペース文字があります - これは文字とルックアップのマップになります。エラーが発生する可能性があるすべての楽しみに対してテストする必要があるため。高レベルから、C++はこのような文字列操作のための最良の言語ではないかもしれないと私は言います。 –