2010-05-21 3 views
4

C 및 C++에서 다른 API를 구현하기 위해 노력하고 있으며 프레임 워크에서 문자열을 받거나 다시 전달할 때 인코딩 오류가 발생하는 것을 피하기 위해 어떤 기술을 사용할 수 있는지 궁금합니다. 예를 들어 고객이 번역에 영향을 미치기 위해 구현할 수있는 C++의 간단한 플러그인 API를 상상해보십시오. 다음과 같은 함수가있을 수 있습니다 :C/C++ API에서 문자열의 혼란을 인코딩하지 않으려면 어떻게해야합니까?

const char *getTranslatedWord(const char *englishWord); 

자, 모든 문자열이 UTF-8로 전달되도록하고 싶다고 가정 해 봅시다. 물론 필자는이 요구 사항을 문서화 하겠지만, 컴파일러에서 올바른 인코딩을 적용하고 싶을 것입니다. 아니면 전용 유형을 사용하는 것이 좋습니다. 예를 들어,이 같은 :

class Word { 
public: 
    static Word fromUtf8(const char *data) { return Word(data); } 
    const char *toUtf8() { return m_data; } 

private: 
    Word(const char *data) : m_data(data) { } 

    const char *m_data; 
}; 

나는 이제 API에이 특수 유형을 사용할 수 있습니다

Word getTranslatedWord(const Word &englishWord); 

불행히도, 이것은 매우 비효율적 쉽게 만들 수 있습니다. Word 클래스에는 적절한 복사 생성자, 할당 연산자 등이 부족합니다. 가능한 한 많은 불필요한 데이터 복사를 피하고 싶습니다. 또한 Word이 점점 더 많은 유틸리티 함수 (예 : length 또는 fromLatin1 또는 substr 등)로 확장되는 위험이 있음을 알았습니다. 또 다른 String 클래스를 작성하지 않을 것입니다. 우연한 인코딩 믹스를 피하는 작은 컨테이너가 필요합니다.

다른 사람이이 경험이 있으며 유용한 기술을 공유 할 수 있는지 궁금합니다.

EDIT : 필자의 특별한 경우 API는 Windows의 경우 MSVC 6 - MSVC 10을 사용하고 Linux의 경우 gcc 3 & 4를 사용합니다.

+0

어떤 OS입니까? 무슨 컴파일러? –

+0

@ 앤더스 : 귀하의 의견에 답변하기 위해 제 질문을 업데이트했습니다. –

답변

4

당신은 표준을 arround 전달할 수 :: 쌍을 대신 문자 *의 :

struct utf8_tag_t{} utf8_tag; 
std::pair<const char*,utf8_tag_t> getTranslatedWord(std::pair<const char*,utf8_tag_t> englishWord); 

가 생성 된 머신 코드 표준의 빈 기본 클래스 최적화를 사용하는 괜찮은 현대 컴파일러에 동일해야합니다 :: 쌍 .


이 경우에도 신경 쓰지 않아도됩니다. 난 그냥 char * s를 사용하고 입력이 utf8이어야한다고 문서화한다. 데이터가 신뢰할 수없는 소스에서 왔을 수 있다면 런타임의 인코딩을 확인해야합니다.

+0

+1 꽤 창의적인 아이디어입니다. :-) –

+1

+1 'do not bother'... 그냥 utf-8을 사용하십시오. –

1

std::wstring을 사용하는 것이 좋습니다.

자세한 내용은 this 다른 질문을 확인하십시오.

+0

예, std :: wstring은 후보로 보입니다. 그러나 사람들이 자신의 플러그인을 표준 C++ 라이브러리에 링크 할 필요가없는 무언가가 있을지 궁금합니다. 적어도 Visual Studio 2009에서는 필자가 볼 수있는 한 모든 인라인 템플릿 마법이 아닙니다. –

+1

std :: wstring을 사용하는 것은 좋은 생각이 아닙니다. 이것은 wchar_t의 시퀀스입니다 - Microsoft 컴파일러에서는 16 비트 정수형이고 gcc에서는 32 비트 정수형입니다. 따라서 std :: wstring은 utf16LE, utf16BE, utf32BE 또는 utf32LE를 합리적으로 포함 할 수 있습니다. –

0

ICU 프로젝트는 C++ 용 유니 코드 지원 라이브러리를 제공합니다.

+0

사실,하지만 완전히 새로운 라이브러리를 가져 오지는 않을 것입니다. –

+0

다른 기능을 필요로하지 않는 한 ... –

관련 문제