2 に答える
表示されているバイト シーケンスは、文字の UTF-8 エンコード バージョンです。
Unicode コード ポイントに到達するには、UTF-8をデコードする必要があります。
この正確なバイト シーケンスでは、次のビットがコード ポイントを構成します。
11100011 10000010 10100010
**** ****** ******
したがって、アスタリスクが付いたビットを連結すると、数値が得られます0011000010100010
。これは、10 進数で 0x30a2 または 12450 に相当します。
エンコーディングの解釈方法の詳細については、ウィキペディアの説明を参照してください。
簡単に言うと、ビット 7 が最初のバイトに設定されている場合、設定されている隣接するビット ( mと呼びます) の数 (2) は、このコード ポイントに続くバイト数を示します。各バイトから抽出するビット数は、最初のバイトが (8 - 1 - 1 - m ) で、後続の各バイトから 6 ビットです。したがって、ここでは (8 - 1 - 1 - 2) = 4 + 2 * 6 = 16 ビットが得られます。
コメントで指摘されているように、これには多くのライブラリがあるため、自分で実装する必要はないかもしれません。
ウィキペディアのページから作業して、私はこれを思いつきました:
unsigned utf8_to_codepoint(const char* ptr) {
if( *ptr < 0x80) return *ptr;
if( *ptr < 0xC0) throw unicode_error("invalid utf8 lead byte");
unsigned result=0;
int shift=0;
if( *ptr < 0xE0) {result=*ptr&0x1F; shift=1;}
if( *ptr < 0xF0) {result=*ptr&0x0F; shift=2;}
if( *ptr < 0xF8) {result=*ptr&0x07; shift=3;}
for(; shift>0; --shift) {
++ptr;
if (*ptr<0x7F || *ptr>=0xC0)
throw unicode_error("invalid utf8 continuation byte");
result <<= 6;
result |= *ptr&0x6F;
}
return result;
}
これは非常に貧弱な実装であり (コンパイルできるかどうかは非常に疑わしい)、おそらくすべきではない多くの無効な値を解析することに注意してください。私がこれを提示したのは、あなたが思っているよりもはるかに難しいことであり、優れた Unicode ライブラリを使用する必要があることを示すためだけです。