3

WindowsのUnicodeUTF-8、MSVC 10でコーディングする必要があります。UTF-8でエンコードされた文字列は、1文字あたり1バイトまたは2バイトを使用することを認識しています。だから、私の質問は:std :: stringはこれに適していますか?はいの場合、文字列をデコードするにはどうすればよいですか?私が理解している限り、std :: stringは単なるバイトの配列であり、デコードロジックを提供していません。文字列の論理的な長さを知るにはどうすればよいですか?文字列から論理文字を抽出するにはどうすればよいですか?文字列から論理文字を抽出するのに役立つライブラリはありますか?

例:std :: stringに文字列「olé」がある場合、長さが3であるが、4ではないことを知る必要があります。

4

3 に答える 3

3

一般的に使用されるライブラリは ICU-Unicodeの国際コンポーネントです

于 2012-06-25T10:16:04.627 に答える
2

はい、std::string適切ですが、お気づきのとおり、Unicodeコードポイントではなく、バイトでのみ動作します。その中で、std::stringは不透明(OPAQUE)型です。これは必ずしも悪いことではありませんが(実際には、いくつかの利点があります。詳細については、以下のリンクを参照してください)、文字に関する情報が必要な場合は、文字列をデコードする必要があります。

UTF-8の実際の処理(必要な場合)については、Boost.NoWideライブラリを使用してUTF-8をデコードできます。

さらに、 UTF-8と他のUnicode変換の使用に関する情報については、どこでもUTF-8マニフェストを読むことをお勧めします。

于 2012-06-25T10:17:52.323 に答える
-2

まず、mbstowcs()関数を呼び出して、UTF-8文字をワイド文字に変換することをお勧めします。次に、結果を8ビットにしたい場合は、「Unicode」文字(ISO-8859-1プレーンの外側の文字、ラテン1とも呼ばれます)がある場合にデータが失われます。

「Windows」エンコーディングはISO-8859-1と1対1で同等ではないことに注意してください。ただし、ほとんどの場合、ISO-8859-1は最近人々が使用しているものです。

参照:http ://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/

さて、文字の長さだけが必要な場合は、mblen()関数を使用します。

len = mblen(str.c_str(), str.length());

追記:mblen()を実装する簡単な方法は、0x80と0xBFの間にないバイト数をカウントすることです。これは、これらがマルチバイトシーケンスの一部であるためです。これは、不安定なシリアル接続を介してUTF-8バイトシーケンスを受信する場合に特に便利です。

于 2012-06-25T10:14:35.220 に答える