2017-01-06 5 views
0

英語のアルファベット にルーンを翻訳するプログラムを作成していますので警告が表示されます:警告:複数文字の定数[-Wmultichar] 「 コードはC++"警告:複数文字の定数[-Wmultichar]"とプログラムが動作しません

string s = "ᛡᚣ";(2 UTF-8文字の文字列、ルーン)

if(s.at(0) == 'ᛡ') cout<<"YES";

が、警告がである は、ここでのコードである(ないプログラムから、それは同じ問題を抱えています)主な問題ではなく、問題は私はそれを実行すると "YES"を出力しません。プログラムの場合、ルーンをアルファベットに翻訳しようとすると、ルーンを翻訳するのではなく、束のendl関数を作成します(基本的には何もしません)

PS I別のcompailersを使用して、Visual Studioのエラーで "Debug Assertion Failed!" 「式:文字列の添え字が範囲外です」 他のコンパイラは何もしません。「\ u16B3」のような文字の代わりにユニコードを使用してプログラムを構築しようとしましたが、同じです。私はutf-8のための特定のライブラリが必要ですか? pls help

+0

コンパイラが説明するように、実装固有の値であるため、多文字定数を使用します。 utf-8を使用する場合は、複数の文字を比較する必要があります。 – Jarod42

答えて

0

std::stringの文字の表記を見ると、各文字が複数のバイトを使用していることがわかります。したがって警告です。 Unicodeを扱うときは、個々のコードポイントを表すために32ビットのものを使用するか、コードポイントごとに複数のバイトを使用する必要があります。コードポイントの使用は(おそらく)ですが、組み合わせ文字を使用しない文字に依存します。

ユニコード文字列を比較することは、あまり一般的ではありません(すべてのルールがわかりません)。 UTF-8を使用してデータを表現する場合、バイトシーケンスを比較する必要があります。さらに、Unicode文字列が正規化されていることを確認する必要があります。一部の文字列は、有効な表現が異なります。たとえば、私の名前のuウムラウトは、u-ウムラウトのコードポイントで表現することも、uのコードポイントとダイレシスの文字を組み合わせて表現することもできます。あなたのコードで私はあなたが使用できると思います

std::string expect("ᛡ"); 
if (expect.size() <= s.size() && s.substr(0, expect.size()) == expect) 
    std::cout << "YES\n"; 
+0

これをどのようにサイクルで使用できますか?もし私がstring = ""ᚠᚢᚦᚩᚱᚳᚷᚹᚻᚾᛁᛂᛇᛈᛉᛋᛏᛒᛖᛗᛚᛝᛟᛞᚪᚫᚣᛡᛠ "を持っているなら、アルファベットに変換したいのですか? – IntotheVoid

+0

@IntotheVoid:あなたがやろうとしていることに依存します特定の文字を見つけるために、' std :: string '文字列や文字の処理を行う場合は、おそらくICUのような適切なUnicodeライブラリを使用して、エンコーディングに対処する必要があります。 –

関連する問題