2012-08-14 6 views
0

를 제출 러시아어 문자 wstring을 쓸 수 없습니다, 다음 코드에서 C에서 ++ 코드 : 내용 input.tab내가 리눅스 (러시아어)는 wstrings을 쓰기 위해 노력하고있어

ofstream outWFile; 
outWFile.open("input.tab"); 
outWFile<< WStringToString(w->get_form()); 
outWFile<<"\t"; 
outWFile<<WStringToString(w->get_tag()); 

std::string WStringToString(const std::wstring& s) 
{ 
    std::string temp(s.length(),' '); 
    std::copy(s.begin(), s.end(), temp.begin()); 
    return temp; 
} 

가 무효

나는 stackoverflow에서 제안 된 것을 시도했다. Unable to write a std::wstring into wofstream 그러나 나는 도움이되지 못했다. 미리 감사드립니다.

+0

가능한 중복 [A 표준을 쓸 :: wofstream에 wstring을 할 수 없습니다 (http://stackoverflow.com/questions/5104329/unable-to-write-a-stdwstring-into-wofstream) – Griwes

+0

그 'ostream <<'은'outWFile'이어야합니까? – Etherealone

+0

코드에 파일 쓰기가 전혀 표시되지 않고 표준 출력에만 표시됩니다. – bames53

답변

0

변환 기능이 잘못되었습니다 : 코드 포인트가 128/256 이상인 모든 문자 (사용자의 지역에 따라 다름)가 엉망이됩니다.

대신 wcstombs을 사용하십시오 (UTF-8 로켈을 사용해야합니다).

+0

WStringToString은 확실히 잘못되었지만 파일에 쓰는 데 사용되는 것은 확실하지 않습니다. 또한 wcstombs와 같은 로케일 기반 변환에 의존하지 않는 것이 좋습니다. 로케일이 사용하기에 적절한지 확인해야하며 그렇지 않은 경우 로케일을 변경해야합니다. 이것은 신뢰성이 없거나 사용자에게 친숙하지 않습니다. 로케일 기반 변환은 실제로 무엇이든지 로케일 인코딩을 사용하려는 경우에만 사용해야합니다 (그리고 이는 드문 IME입니다). – bames53

+0

@ bames53 : 예, 로케일로 인해 문제가 발생할 수 있습니다. 필자는 개인적으로 대부분의 리눅스 코딩을 현대 리눅스 시스템의 경우처럼 UTF-8 로케일과 함께 사용한다는 가정하에 적용합니다 (그러나 해당되는 경우).하지만 나는 C++이 아닌 것을 제안 할 수 있었을 것입니다. 유니 코드 도구가 내장되어 있습니다. –

+0

네, 저는 모든 것을 위해 UTF-8을 항상 가정하고 로캘 인코딩을 무시합니다. 유일한 문제는 그 (것)들을 가치가있는 사람들을 위해 일어난다. – bames53

0

직접 wstring 콘텐츠를 사용하는 것이 좋습니다.

outWfile.write(w->get_tag()->data(), w->get_tag()->size()*sizeof(wchar_t)); 
// I used data() assuming the string and wstring methods are the same? 
// Anyhow, get the pointer to wstring's data here.