5

私はこのコードを持っています:

string test("żaba");

cout << "Word: " << test << endl;
cout << "Length: " << test.size() << endl;
cout << "Letter: " << test.at(0) << endl;

出力は奇妙です:

Word: żaba
Length: 5
Letter: �

ご覧のとおり、長さは 4 で文字は "ż" でなければなりません。

このコードを修正して正しく動作させるにはどうすればよいですか?

4

2 に答える 2

6

あなたの質問はエンコーディングについて言及していないので、暗闇の中で突き刺して、これが理由だと言います。

最初の行動方針: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)を読んでください。

その後、「裸の文字列」のようなものは存在しないことが明らかになるはずです。すべての文字列は何らかの方法でエンコードされています。あなたの場合、分音記号付きの UTF-8 でエンコードされた文字列を使用しているように見えます。その場合、文字列の長さは (正しく) 5 1として報告され、最初のコード ポイントはそうではない可能性があります。お使いのプラットフォームで印刷可能です。


1)論理文字やコードポイントではなく、バイト(= s) をstring::sizeカウントすることに注意してください。char

于 2012-05-13T09:58:26.273 に答える
5

std::stringWindows 以外では通常、UTF8 文字列を格納するために使用されます (2010 年のこちら側のほとんどの健全なオペレーティング システムではデフォルトのエンコーディングです)。保存しているバイト。読み取り、保存、および書き込みに使用できます。ただし、文字列操作用ではありません。

よく管理された優れたIBM ICU : International Components for Unicodeを使用する必要があります。これは *nix または Windows 用の C/C++ ライブラリであり、大文字と小文字を区別しない高速で正確な文字列比較など、カルチャを意識した文字列ライブラリを提供するために多くの研究が行われています。

C++ 開発者にとって切り替えが容易なもう 1 つの優れたプロジェクトは、UTF8-CPPです。

于 2012-05-13T09:59:52.520 に答える