2012-02-10 3 views
1

우리는 엔진에 내장 된 주석 시스템을 사용하여 프로그래머가 GUI 프론트 엔드에서 도구 팁과 도움말을 위해 사용하는 다양한 노출 변수/개체에 대한 주석을 달 수 있습니다.C++에서 유니 코드 문자 다루는 방법

최근에 특정 도구 설명이 충돌하기 시작했고 많은 낭비를 겪은 후에 문자로 추적했습니다 : 내가 잘못하지 않는 한 유니 코드 문자이며 ASCII로 사용할 수 없습니다.

this answer을 고려한 결과 wstring으로 문제를 해결할 것으로 가정했습니다. 더 큰 프로젝트에서 변경하기 전에, 나는 wstring이 문제를 해결할 수 있는지 확인하기위한 테스트 프로젝트를 만들었습니다. 프로젝트가 중단되지는 않지만 wstring의 경우 예상대로 동작하지 않습니다.

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string someString = "successive attack that DOESN’T result"; 
    wstring someWString = L"successive attack that DOESN’T result"; 

    cout << someString << endl; 
    wcout << someWString << endl; 

    return 0; 
} 

//Console Output// 
successive attack that DOESNÆT result 
successive attack that DOESNPress any key to continue . . . 

나는 this article 꽤 시간 전에 읽고 내가 문자 세트와 관련된 문제를 이해 생각하지만 그건 분명 사실이 아니다. 이 문제에 대한 해결책은 물론 무엇이 일어나고 있는지, 그리고 미래에 이와 유사한 문제를 피하는 방법에 대한 좋은 설명을 고맙게 생각합니다.

+0

로 인코딩되도록 변환합니다. 인코딩은 무엇입니까? –

+2

IIRC 콘솔은 비 코드 페이지 문자를 잘 지원하지 않습니다. 도구 팁이 효과가 있습니까? – Rup

+0

@NiklasB .: 어떻게 확인하겠습니까? 위의 예제에서 Visual Studio 2008을 사용하여 새 프로젝트와 소스 파일을 만듭니다. 소스 파일 자체의 인코딩을 어떻게 확인하겠습니까? 프로젝트 속성에서 출력에 차이가없는'Use Multi-byte Character Set'과'Use Unicode Character Set'을 시도했습니다. – Samaursa

답변

4

Visual Studio를 사용하고 있으므로 사용자는 Windows를 사용하고 있다고 가정합니다. Windows 콘솔은 유니 코드를 지원하지 않습니다. OEM char 세트를 사용합니다. CharToOemW/OemToCharW를 사용하여 둘 사이를 변환 할 수 있습니다. 분명히 모든 유니 코드 문자를 나타낼 수는 없습니다.

Windows는 시스템 API에 UTF16을 사용합니다. 툴팁에 Windows API가 사용되는 경우에는 사용하려는 wstring 일 가능성이 큽니다. 그러나 대신 Windows API를 호출하기 전에 UTF8을 사용하여 이것을 UTF16으로 변환 할 수 있습니다. 이 변환은 MultiByteToWideChar/WideCharToMultiByte를 사용하여 수행 할 수 있습니다. 유니 코드 문자를 처리하기 때문에 당신이 프로젝트 속성에서 설정 유니 코드 문자에 설정 문자를 설정하면

+0

고정 빌드를 얻으려면 할 수있는 임시 해결책이 있습니까 (예 : 유니 코드 문자가 마자 마자 무시하십시오)?모든 문자열을'wstring'으로 변환하기 시작합니다 (꽤 많은 시간이 걸릴 것입니다). – Samaursa

+0

값이 127보다 큰 모든 문자를 건너 뛰면 ASCII 문자 만 나타납니다. – rasmus

+1

UTF8에 유리한 점은 일반 문자열을 계속 사용할 수 있다는 것입니다. 즉, 모든 문자열을 wstring으로 변환 할 필요가 없습니다. 대신 유니 코드 (UTF16) Windows API를 호출 할 때 변환해야합니다. – rasmus

1

, 그것은 적절하다.

또 다른 가능한 문제점은 소스 파일의 인코딩 일 수 있습니다. 유니 코드 문자로 작업하는 가장 좋은 방법은 소스 파일을 UTF-8으로 인코딩하는 것입니다. 특히이 파일과 같은 문자열 리터럴을 정의하는 파일이 좋습니다. BOM이없는 UTF-8은 Visual Studio에서 파일 내용을 올바르게 intepret 할 수 있도록 BOM이 필요하기 때문에 번거로울 수 있습니다. 파일을 변환 (나는 메모장 ++ 이것에 대한 사용)가 UTF-8 어쩌면 소스 파일 자체가 제대로 인코딩되지 않은

+0

NPP (UTF-8 또는 UCS-2로 저장)에서 동일한 작업을 시도했지만 도움이되지 않습니다 (비록 VS가없는 원시'cl'을 사용했지만). 문제는 콘솔이 출력을 이해하지 못한다는 것입니다. –

+0

내 경험에 따르면 프로그램에서 유니 코드 문자 집합을 사용하고 문자열 리터럴을 올바르게 표시하지 않으면 원본 파일의 인코딩이 잘못되었을 가능성이 높습니다. – LihO

+0

솔직히 말해서 콘솔로 시도하지 않았습니다. – LihO