2009-09-30 3 views
4

저는 내부적으로나 고객이 사용할 라이브러리를 작성하고 있으며 유니 코드와 ASCII를 모두 지원하는 가장 좋은 방법이 무엇인지 궁금합니다. 그렇습니다, 나는 매크로의 거대한 팬이 아니에요 동안C++에서 유니 코드와 ASCII를 모두 지원하는 라이브러리를 만드는 가장 좋은 방법은 무엇입니까?

#ifdef _UNICODE 
#define CString CStringW 
#else 
#define CString CStringA 
#endif 

: 그것은합니다 (MFC 라이브러리에) 마이크로 소프트과 같은 매크로를 사용하여 헤더 파일이 비슷한을 모두 유니 코드와 ASCII 클래스를 작성하고 수행 작업.

#ifdef _UNICODE 
#define GetLastErrorString GetLastErrorStringW 
#else 
#define GetLastErrorString GetLastErrorStringA 
#endif 

std::string GetLastErrorStringA(); 
std::wstring GetLastErrorStringW(); 

아니면 그냥 별도의 라이브러리를 해제해야합니다, ASCII 다른 하나는 유니 코드를 하나 내가 STL을 사용하여 라이브러리를 쓰고 있어요 경우,이 같은 것들을 포함 된 헤더를 작성하는 의미가 무엇입니까?

사람들이 생각하는 것이이 상황에서 가장 좋은 방법인지 궁금합니다.

UPDATE : 일부의 의견과 질문을 주소는 :

  • 다음은 C++ 클래스 라이브러리 될 것입니다.
  • 아시아 문자 집합을 지원하기 위해 UTF-16 인코딩을 사용해야한다고 생각합니다.
  • 유니 코드 구현의 이유는 두 가지입니다. 1) 모든 새 SDK가 유니 코드를 지원하며 향후 SDK 또는 타사 라이브러리가 향후 별도의 ASCII 버전을 지원할 것이라고 확신하지 못합니다. 2) 응용 프로그램을 완전히 국제화하지는 않지만 사용자 입력 (이름 등) 및 아시아 문자가 포함 된 경로에서로드하는 파일을 처리 할 수 ​​있으면 좋을 것입니다.
+0

플랫 C 스타일 API 또는 C++ 클래스 세트를 개발하고 있습니까? – Michael

+0

예제에 문제가 있습니다. 메서드의 반환 유형을 별칭으로 지정해야합니다. 메서드 자체가 컴파일되지 않을 가능성이 있습니다 (메서드 구현시 #define을 사용해야 할 수도 있지만).). –

+0

제 경험상 아시아 (CJK) 문자에는 UTF-16을 사용할 필요가 없습니다. 내 프로그램은 멀티 바이트 UTF-8 whitout 모든 종류의 마법으로 그들을 잘 처리합니다. – akaltar

답변

4

전적으로 라이브러리를 내부적으로 유니 코드로 만들 것입니다. 그런 다음 유니 코드 구현에 대해 썽크 (snunk) 한 ASCII 용 C++ 어댑터 클래스 세트가 존재합니다.

+0

질문 : 인코딩에 따라 일반 std :: string이 트릭을 수행 할 수 있으므로 내부적으로 '유니 코드'를 사용해야합니다. –

0

문제는 당신이 정확한 인코딩에이 ...

먼저 조금 부정확하지만. 유니 코드는 문자의 표현 일뿐입니다 (각각 코드 포인트와 연결됨). 응용 프로그램에서 유니 코드를 처리 할 때는 코드 포인트의 표현 방식을 선택해야합니다.

    : 당신이 UTF-8로 갈 수 있다면, 당신은 당신이 정확한에 문제가 그리고 일반 표준 : : 문자열 :

    에 데이터를 저장할 수 있으며, 다양한 문자에 대해 걱정할 필요가 없습니다

  • 유니 코드 및 Ascii에서 항목을 지원 하시겠습니까?
  • 또는 출력에 대해 이야기하고 있습니까?
  • 어쨌든 std :: locale을 사용하여 어떤 인코딩을 출력해야하는지 알 수 있습니까?

저는 국제화 된 응용 프로그램 (웹 사이트, C++ 백엔드 ...)에서 작업하고 있으며 단순히 std :: string을 내부적으로 사용하고 있습니다. Ascii 또는 Utf-8의 출력은 변환 파일에 따라 다르지만 데이터 표현은 이탤릭체로 변경되지 않습니다 (문자 수 계산 제외,이 항목의 my post 참조).

utf-8은 Ascii와 호환 될 예정 이었기 때문에 정말로 매크로 팬이 아닙니다. 자신 만의 인코딩을 선택할 수 있다면, 저장되었습니다!

1

유니 코드 문자열을 UTF-8로 먼저 변환하면 std :: 문자열에 저장할 수 있습니다.

Windows API와 같이 UTF-16 호출로 인터페이 스할 때만 wstring이 필요합니다. 이 경우 필요한 경우 문자열을 로컬로 wstring으로 변환 할 수 있습니다. 조금 부담이 될 수 있지만 그렇게 나쁘지는 않습니다.

0

ASCII, UTF-8, 16 또는 32 비트 문자를 사용하지 말고 코드 "이해 가능성"에 대해 묻습니다.

그렇다면 가능한 한 큰 코드 블록을 만드는 것이 좋습니다. 즉, "게이트"(_UNICODE 기호 상수)를 사용하여 별도의 파일이나 코드의 큰 덩어리를 선택하는 것이 좋습니다. 성명서 내에서 다른 모든 행 또는 그 또는 하늘, 또는 금지 된 점을 변경하는 코드는 이해하기 어렵습니다.

내가 게이트를 사용에 대한 조언은 별도의 파일

#ifdef _UNICODE 
#include "myUniLib.h" 
#else 
#include "myASCIILib.h" 
#endif 
수반과 같은

의 흠을 선택하는 것이 어쩌면 세 개의 파일 (유니 코드 파일의 646US (ASCII) 파일 및, 어쩌면, 위의 코드가있는 넥서스 파일). 이는 무언가가 손실되고 결과적으로 빌드가 실패 할 가능성이 3 배입니다.

대신, 코드의 큰 블록을 선택하는 파일 내에서 게이트를 사용

#ifdef _UNICODE 
    ...lotsa code... 
#else 
    ...lotsa code... 
#endif 

확인을, 당신이 반대를하고있는 말 : 문자 대 문자에 대해 궁금 (UTF-8) 대 대 W 얼마나 보편적이되고 싶습니까? 언급 한 CString은 Windows 용입니다. Mac 및 UNIX (OK, Linux)와 호환되도록하려면 거칠게 타보십시오.

BtW-ASCII는 ... 인식되지 않은 표준입니다. ASCII가 있고 ASCII가 있습니다. 유닉스 옛날의 7 비트 "표준"을 의미한다면 가장 가까운 ISO-646US가 있습니다. 유니 코드는 ISO-10646입니다.

일부 사람들은 ASCII 문자와 숫자 및 퍼센트 기호를 URL로 사용하여 문자를 인코딩하는 데 운이 좋았습니다. 모든 시간을 인코딩하고 디코딩해야하지만 스토리지는 실제로 예측할 수 있습니다. 좀 이상 하네, 맞아.하지만 확실히 혁신적이야.

일부 언어 적 함정이 있습니다. 예를 들어, 양방향성이 필요한 경우에 의존하지 마십시오 (여기서는 적절한 단어를 모르겠습니다). Deutsch에서는 대문자로 변환 할 때 소문자 ß가 SS가됩니다. SS는 소문자 인 경우 ß가 아닌 ss로 변합니다. 터키에는 비슷한 것이 있습니다. 응용 프로그램을 설계 할 때 대/소문자 변환이 도움이된다고 가정하지 마십시오.

또한 문법적 순서는 언어에 따라 다릅니다. 단순한 "안녕, 짐! 월요일은 어때?" "안녕, 너 월요일이야, 잘된거야, 짐?"

마지막으로 경고 : 스트림 IO (std :: cin < < 및 std :: cout >>)를 피하십시오. 이는 메시지 생성기를 현지화하는 것이 매우 어려워지는 방식으로 메시지 생성기를 포함하도록 함정에 빠져 든다.

올바른 질문을하고 있습니다. 당신 앞에 모험이 있습니다! 베스트!