2011-12-20 7 views
5

私はC++ライブラリを使用しており、UTF-8コードポイントからunsigned charを作成する必要があります。たとえば、コードポイントがdecimal 610(「ラテン文字小文字G」)の場合、C++でどのように作成すればよいでしょうか?C++:UTF-8コードポイントからunsigned charを作成する方法

IのJavaScript、私は次の操作を実行できます試みたC++で

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

を上記のJavaScriptの例と同じように実行するC++のコード例を提供してください。

環境は管理対象のC++ですが、私はサードパーティのライブラリと接続しているので、CLR型の使用を避けたいと考えています。

+0

'DEBUG'の種類は何を? 'Debug'はUTFを認識しますか? C++のostreamはそうしないので。あなたはUTF、特にUTF8で多くを行うためのライブラリが必要です。 –

+0

'unsigned char'は最大255までの値を保持することが保証されています。 Unicodeのコードポイントがはるかに大きくなる可能性があります。あなたの問題はよく述べられていません。 –

+0

ああ、これを行うことができれば人生はずっと楽になります..... –

答えて

5

unsigned charは、(それだけで0〜255の値を保持することができ、charが8ビット幅であると仮定して)、それは、wrap around *

使用char16_t 16を格納するであろう610の値を保持するために小さなです-bit char(またはUTF-8が必要とする32ビットcharの場合はchar32_t)。

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

あなたはUTF-8文字列リテラル使用し、UTF-8に文字列を処理する場合:

u8"I'm a UTF-8 string." 

を*それはあなたの例でも、二回ラップアラウンドします:

610 - 256 - 256 = 98

+0

ここでは、 'char16_t'と' char32_t'が_codepoints_として使われていることに注意してください。 –

+0

@MooingDuckでは、 'char16_t'はすべてのコードポイントを保持するのに十分な大きさではないことを忘れてしまったので、この目的のためには避けてください。 'char16_t'の文字列は、Windowsの必要に応じてUTF-16を保持するために使用されます。 –

3

Unicodeコードポイントに32ビット表現が必要な場合があります。ほとんどの西洋言語では16ビットで十分ですが、すべての可能なUnicodeコードポイントを処理するには、実際には32ビットが必要です。

uint32_t codePoint = someString.CodePointAt(x); 

詳細はこちらhttp://en.wikipedia.org/wiki/Code_pointです。

+0

Unicodeは最大21ビットを使用します。17〜31ビットのデータを表現できる数値データ型がないため、21ビットのデータを表現するために32ビットの数値型が必要です。 –

0

あなたはあなたができるUnicodeコードポイント610のUTF-8表現にunsigned char型のポインティング作成したい場合は意味:

char unsigned temp[] = { 0xc9, 0xa2 }; 
関連する問題