2009-07-30 11 views
0

OracleデータベースからUnicode文字を含む場合と含まない場合があるデータ文字列をC++プログラムに読み込みます。データベースには、Unicode文字(UTF-8)が含まれています。Unicode文字が存在する場合は、16進形式に変換して表示する必要があります。Unicode文字をC++の16進コードで表示する方法

+0

問題は何ですか?どのコードを既に使用していますか? –

+0

ASCII以外のものをすべて破棄したい場合は、バイトをループして、highrstビット(thechar&0x80!= 0)が設定されているものをすべて破棄します。しかし、UTF-8でエンコードされた文字列を直接表示できないのはなぜですか? – nos

答えて

1

この質問には2つの側面があります。

  1. 通常のASCII文字とUTF-8エンコード文字を区別します。

    UTF-8は、127より高い任意のコードポイントを2つ以上のバイトの系列としてエンコードします。 127以下の値は変更されません。エンコーディングの結果のバイトも127より高いので、バイトの上位ビットを調べて、それが適格かどうかを調べるだけで十分です。

  2. エンコードされた文字を16進数で表示します。

    C++には、ストリームに16進数で数値を書式設定するように指示するためのstd::hexがあります。 std::showbaseを使用すると、出力をきれいに見せることができます。ただし、charは数値として扱われません。ストリームは文字を印刷します。値を別の数値型(たとえば、int)にする必要があります。しかし、記号拡張に注意してください。ここで

は実証するいくつかのコードです:

#include <iostream> 

void print_characters(char const* s) 
{ 
    std::cout << std::showbase << std::hex; 
    for (char const* pc = s; *pc; ++pc) { 
    if (*pc & 0x80) 
     std::cout << (*pc & 0xff); 
    else 
     std::cout << *pc; 
    std::cout << ' '; 
    } 
    std::cout << std::endl; 
} 

あなたはこのようにそれを呼び出すことができます。日C++ 5.8を使用するSolaris 10上の

int main() 
{ 
    char const* test = "ab\xef\xbb\xbfhu"; 
    print_characters(test); 
    return 0; 
} 

出力:

 
$ ./a.out 
a b 0xef 0xbb 0xbf h u 

コードはUTF-8でエンコードされた文字を検出し、それを解読する努力はしません。あなたはそれをする必要はないと言いました。

私は*pc & 0xffを使用して、式を整数型に変換し、符号拡張ビットをマスクアウトしました。それがなければ、私のコンピュータの出力は0xffffffbbでした。

+0

こんにちはRob、 私は取った文字列がUnicode文字の16進形式を含むが、私のデータベースにはUnicode文字が含まれていると言うことができますアラビア語私はアラビア語で存在する文字を16進文字に変換したいと言う。 ex:char * test = "مرحبا" "مرحبا"のヘキサフォーマットを出力したい。 –

+0

あなたはその点を見逃しています。ただし、文字列を文字列に変換することはできますが、必要に応じて文字列を取得できます。それがデータベースのものなら、それでは。文字列に文字を入れたら、ASCII以外の文字を検出してUTF-8バイトを16進形式で表示するようなコードを使用できます。私は、文字列の内容を検出してその中に文字を入れることの違いを強調したいと考えてコードを編集しました。私の文字列リテラルは、文字列にテスト可能なものを置く簡単な方法でした。 –

0

文字列をUTF-32に変換します(これはUTF CPPと非常に簡単です)。結果の文字列をループし、0x7F以上のコードポイント(文字)を検出して印刷します。ヘックスとして。

関連する問題