1

UTF8文字をその代表的なUnicodeコードポイントに変換するクラスメソッドを絞り込んでいます。私のプロトタイプ候補は以下のものです:

static uint32_t Utf8ToWStr( uint8_t Byte1,        uint8_t Byte2 = 0x00,
                            uint8_t Byte3 = 0x00, uint8_t Byte4 = 0x00,
                            uint8_t Byte5 = 0x00, uint8_t Byte6 = 0x00);

static uint32_t Utf8ToWStr(const std::vector<uint8_t> & Bytes);

私のアプリケーションでは;
Byte1約90%の確率でゼロ以外のバイトのみになります。約9%の確率でゼロ以外のバイトのみになります
Byte1。、および1%未満の時間の唯一の非ゼロバイトになります。、およびほとんどの場合ゼロになります。Byte2
Byte1Byte2Byte3
Byte4Byte5Byte6

速度のためにどのプロトタイプを好むべきですか?

4

3 に答える 3

3

私が使用します

// if you want it as simple as possible
typedef uint8_t data_t[6];

また

// if you like C++11
typedef std::array<uint8_t, 6> data_t;

また

// if it should be extensible
typedef struct { uint8_t data[6]; } data_t;

コンパイル時の入力データの固定長の性質を指摘します。このようにして、実際に関数を呼び出す多くの入力を節約できます。

可変長のベクトルを使用すると、データが多かれ少なかれ空になる可能性があることがどういうわけか示唆されます。

于 2012-09-18T07:24:21.203 に答える
2

おそらくどちらでもない。

この関数を呼び出すコードについて考えてみてください。使用するには、大規模なフープを飛び越えなければならない可能性があります。

uint8_t c1 = *cursor++;
uint8_t c2 = 0;
uint8_t c3 = 0;
uint8_t c4 = 0;
uint8_t c5 = 0;
uint8_t c6 = 0;
if(c1 >= 0x80)
    c2 = *cursor++;
if(c1 >= 0xc0)
    c3 = *cursor++;
if(c1 >= 0xe0)
    c4 = *cursor++;
if(c1 >= 0xf0)
    c5 = *cursor++;
if(c1 >= 0xf8)
    c6 = *cursor++;
uint32_t wch = Utf8ToWStr(c1, c2, c3, c4, c5, c6);

このインターフェースが便利だとは心から疑っています。

変換ルーチンの通常のインターフェイスは

bool utf8_to_wchar(uint8_t const *&cursor, uint8_t const *end, uint32_t &result);

戻り値はエラーを伝えるために使用されます(たとえば、関数はパラメーターにどのように反応します(0x81, 0x00)か?

最後になりましたが、非正規化されたUTF-8でエラーが発生するかどうかを指定するモードが必要になる場合があります。セキュリティPOVからは、としてのエンコードを禁止することをお勧めしU+003Fます0x80 0x3f

于 2012-09-18T07:18:23.467 に答える
1

std :: vectorは、それらのバイトをヒープに格納し、それらにメモリを割り当てるため、おそらく低速です。

バイト配列へのポインタを渡すか、C++11を使用している場合はstd::arrayを使用することもできます。

于 2012-09-18T07:06:01.337 に答える