2012-02-17 8 views
2

나는 이것을 related question으로 읽었지만 꽤 도움이되지 않습니다.xcode UTF8 리터럴 문자를 사용하는 ENUM

열거 형의 목표는 4 바이트 범위 내에서 단일 UTF-8 문자의 원시 UTF-8 코드 (유니 코드 코드 포인트 아님)를 포함하는 것입니다.

다음 예제는 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 
}; 

감사합니다. http://liveworkspace.org/code/3EtxVE 일품

+0

열거 형 내부에 특정 멀티 바이트 시퀀스를 포함하려는 시도는 좋지 않습니다. 적어도 엔디안에 대한 관심이 있습니다. –

+0

엔디 언이 이미 고려되어 있으므로 문제가되지 않습니다. –

답변

1

를 사용하여 C++ (11) constexpr 및 U8 접두사 : 당신이 U8 접두사에 대한 액세스 권한이없는 경우

#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

를 출력 당신은 단순히을 보장 할 수 있습니다 소스 파일은 UTF-8로 인코딩되어 있으며 필요에 따라 constexpr을 매크로로 변환 할 수 있다고 생각합니다.

관련 문제