2012-02-17 13 views
2

これはrelated questionを読みましたが、それは私にはあまり役立ちません。xcode ENUM UTF8リテラル文字を使用して

Enumの目的は、4バイトの範囲内で単一のUTF-8文字の生のUTF-8コード(Unicodeコードポイントではない)を含めることです。

次の例は、xcodeソースファイルがUTF-8形式(xcodeの推奨エンコード)であるために機能します。これはコンパイルされ、正しい期待値で実行されます。 しかし、私も警告 "この型の文字定数が長すぎます"を取得します。私はそれを抑制するかもしれない?..または悪い考え?

typedef enum { 
    TEST_VAL_1BYTE = ',', // 0x2C 
    TEST_VAL_2BYTE = '§', // 0xC2A7  (the warning) 
    TEST_VAL_3BYTE = '✓', // 0xE29C93 (the warning) 
    TEST_VAL_4BYTE = '', // 0xF09D8DA5 (the warning) 
} TEST_VALUES_UTF8; 

最も安全な方法と警告なしで、それはコードにもっと退屈です:

最後に
typedef enum { 
    NUM_VAL_1BYTE = 0x2C,  // , 
    NUM_VAL_2BYTE = 0xC2A7,  // § 
    NUM_VAL_3BYTE = 0xE29C93, // ✓ 
    NUM_VAL_4BYTE = 0xF09D8DA5, // 
} TEST_VALUES_UTF8; 

1つのまたは4 ASCII文字とその列挙を注意してくださいが有効であると警告なし:

enum { 
    ENUM_TEST_1  = '1',  // 0x31  (no warning) 
    ENUM_TEST_12 = '12', // 0x3132  (w: multi-character character constant) 
    ENUM_TEST_123 = '123', // 0x313233 (w: multi-character character constant) 
    ENUM_TEST_1234 = '1234', // 0x31323334 (no warning) 
}; 

UTF-8コードを返すことができるソースエンコーディングジェネリックであるプリプロセッサマクロが多分あるでしょうか。

enum { 
    TEST_VAL_2BYTE = AWESOME_UTF8CODE_MACRO('§'), // 0xC2A7 
}; 

ありがとうございます。

+0

列挙型の中に特定のマルチバイトシーケンスを格納しようとするのは悪い考えです。最低でも、エンディアンの懸念があります。 –

+0

エンディアンはすでに考慮されているため、問題は発生しません。 –

答えて

1

使用C++ 11 constexprのとU8の接頭辞、http://liveworkspace.org/code/3EtxVE a'la:

#include <iostream> 
#include <cstdint> 

constexpr uint32_t utf8(const char (&c)[2]) { 
    return uint8_t(c[0]); 
} 
constexpr uint32_t utf8(const char (&c)[3]) { 
    return uint8_t(c[1]) | (uint8_t(c[0])<<8); 
} 
constexpr uint32_t utf8(const char (&c)[4]) { 
    return uint8_t(c[2]) | (uint8_t(c[1])<<8) | (uint8_t(c[0])<<16); 
} 
constexpr uint32_t utf8(const char (&c)[5]) { 
    return uint8_t(c[3]) | (uint8_t(c[2])<<8) | (uint8_t(c[1])<<16) | (uint8_t(c[0])<<24); 
} 

typedef enum { 
    TEST_VAL_1BYTE = utf8(u8","), 
    TEST_VAL_2BYTE = utf8(u8"§"), 
    TEST_VAL_3BYTE = utf8(u8"✓"), 
    TEST_VAL_4BYTE = utf8(u8""), 
} TEST_VALUES_UTF8; 

int main() { 
    std::cout << std::hex << TEST_VAL_1BYTE << std::endl; 
    std::cout << std::hex << TEST_VAL_2BYTE << std::endl; 
    std::cout << std::hex << TEST_VAL_3BYTE << std::endl; 
    std::cout << std::hex << TEST_VAL_4BYTE << std::endl; 
} 

2c 
c2a7 
e29c93 
f09d8da5

を出力しますが、U8プレフィックスへのアクセス権を持っていない場合は、単純に確保することができますソースファイルはUTF-8でエンコードされています。必要に応じてconstexprをマクロに変換することもできますが、これはきれいです。

関連する問題