2013-03-20 2 views
4

wchar_t에 단일 문자를 저장하기 위해 wcin을 사용하고 있습니다. 그런 다음 wcout 호출과 프랑스어 문자 'é'를 사용하여 인쇄하려고 시도하지만 내 콘솔에서는 볼 수 없습니다.wcout 함수가 불어를 인쇄하지 않습니다.

제 컴파일러는 g ++ 4.5.4이고 제 OS는 우분투 12.10 64 비트입니다.

$ ./wideChars 
Enter your char : é 
You entered . 

그래서,이 코드가 무슨 문제 :

#include <iostream> 

int main(){ 
    using namespace std; 

    wchar_t aChar; 
    cout << "Enter your char : "; 
    wcin >> aChar; 
    wcout << L"You entered " << aChar << L" .\n"; 

    return 0; 
} 

난을 programm를 미사일하는 경우 : 여기

내 시도 (wideChars.cpp)인가?

+1

터미널에 설정된 인코딩은 무엇입니까? – filmor

+0

안녕하세요, 어떻게 확인할 수 있습니까? 감사합니다 – loloof64

+0

나는 내 대답을 철회합니다. 내 자신의 Xubuntu 설치에서 이것을 확인했고 나는 같은 문제를 안다. 어떤 이유로 든 'wcin'은 'é'문자 읽기를 거부하고 실패 비트를 설정합니다. – wilx

답변

3

먼저 오류 검사를 추가하십시오. 입력 후 wcin.good()이 무엇을 테스트하고 "입력 한"후 wcout.good()이 반환합니까? 나는 그것들 중 하나가 false을 돌려 줄 것이라고 생각한다.

LANGLC_* 환경 변수는 무엇입니까? wcin.imbue(std::locale("")); wcout.imbue(std::locale(""));

내가 지금 손에 내 우분투가없는, 그래서 여기 장님 비행 대부분 추측하고있다 :

는 그런 다음 main()의 상단에이를 추가하여이 문제를 해결하려고합니다.

위의 제안은 다음에 도움이 대신 imbue() 로케일을 같이 로케일을 구성하지 않는 경우

UPDATE.

std::locale loc (
    std::locale(), 
    new std::codecvt_byname<wchar_t, char, std::mbstate_t>(""))); 

UPDATE 2

여기에 나를 위해 작동하는 것이다. 키는 C 로케일도 설정하는 것입니다. IMHO, 이것은 GNU C++ 표준 라이브러리 구현의 버그입니다. 내가 실수 한 경우가 아니면 std::locale::global("");을 설정하여 C 라이브러리 로켈을 설정해야합니다.

#include <iostream> 
#include <locale> 
#include <clocale> 

#define DUMP(x) do { std::wcerr << #x ": " << x << "\n"; } while (0) 

int main(){ 
    using namespace std; 

    std::locale loc (""); 
    std::locale::global (loc); 
    DUMP(std::setlocale(LC_ALL, NULL)); 
    DUMP(std::setlocale(LC_ALL, ""));  
    wcin.imbue (loc); 

    DUMP (wcin.good()); 
    wchar_t aChar = 0; 
    wcin >> aChar; 
    DUMP (wcin.good()); 
    DUMP ((int)aChar); 
    wcout << L"You entered " << aChar << L" .\n"; 

    return 0; 
} 

UPDATE 3

내가 지금은 다시 재현 std::locale::global(loc);을 설정하는 것은 물론 옳은 일의 WRT/C 로케일을 할 것으로 보인다 수없는 혼란 스러워요.

+0

답변을 주셔서 감사합니다. 입력이 끝난 직후 wcin.good()는 나를 0 (그래서, 거짓)으로 반환하고, 마지막 출력 바로 뒤에 : wout.good()는 1을 반환합니다 (참, true). 내 LANG env 변수는 fr_FR.UTF-8로 설정되어 있고 "echo $ LC_ *"는 "escapeChars escapeChars.cpp limits limits.cpp wideChars wideChars.cpp"를 제공합니다.이제 다음 솔루션을 사용해 보겠습니다. 내 소스 파일과 실행 파일은 wideChars.cpp와 wideChars입니다. – loloof64

+0

불행히도, 귀하의 솔루션 중 아무도 나를 도왔습니다. loc loc (locale, new codecvt_bytename)을 사용하여 로컬을 만들었을 때도 마찬가지입니다. 또한 로케일 정의를 포함하고 main()에 "namespace std 사용"지시문을 보관했습니다. 다음은 최신 소스 파일입니다. http://pastebin.com/ir56SKP0 – loloof64

+0

@LaurentBERNABE : 예제를 통해 답변을 업데이트했습니다. – wilx