타이포그래피 apostrophe+wide 줄 문자 그럴은 내 Wofstream (C ++)을 깨뜨 렸습니다.

StackOverflow https://stackoverflow.com/questions/816092

문제

타자기 아포스트로피 ( ')가 아니라 불길한 타이포그래피 아포스트로피 (')를 다룰 때 이상한 행동이 발생했습니다. 넓은 문자열 문자와 함께 사용되는 Apostrophe는 Wofstream을 깨뜨립니다.

이 코드는 작동합니다

ofstream file("test.txt");
file << "A’B" ;
file.close();

==> A'B

이 코드는 작동합니다

wofstream file("test.txt");
file << "A’B" ;
file.close();

==> A'B

이 코드는 실패합니다

wofstream file("test.txt");
file << L"A’B" ;
file.close();

==> a

이 코드가 실패합니다 ...

wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();

==> a

아이디어가 있습니까?

도움이 되었습니까?

해결책

WOFSTREAM을 사용하기 전에 "로케일 활성화"로케일을 사용해야합니다.

std::locale::global(std::locale()); // Enable locale support 
wofstream file("test.txt");
file << L"A’B";

따라서 시스템 로케일이있는 경우 en_US.UTF-8 그런 다음 파일 test.txt 시스템 로케일이있는 경우 UTF8 인코딩 데이터 (4 BYES)가 포함됩니다. en_US.ISO8859-1, ISO 8859-1이 그러한 문자를 놓치지 않는 한 8 비트 인코딩 (3 바이트)으로 인코딩합니다.

wofstream file("test.txt");
file << "A’B" ;
file.close();

이 코드는 작동합니다 "A’B" 실제로 UTF-8 문자열이며 UTF-8 문자열을 바이트로 바이트에 제출합니다.

메모: 나는 당신이 OS와 같은 POSIX를 사용하고 있다고 가정하고 기본 로케일 인 "C"와 다른 기본 로케일이 있다고 가정합니다.

다른 팁

소스 파일에서 "깨진"유니 코드 문자에 대한 컴파일러의 지원이 아니라고 확신하십니까? 사용하면 어떻게해야합니까? \x 또는 문자열 리터럴에서 문자를 인코딩하는 것과 유사합니까? 인코딩이 무엇이든 wchar_t 컴파일러를 위해?

스트림 삽입 문자를 a try-catch 차단하고 예외가 무엇인지 알려주십시오.

여기서 무슨 일이 일어나고 있는지 잘 모르겠지만 어쨌든 추측을 괴롭 힙니다. 타이포그래피 아포스트로피는 아마도 하나의 바이트에 맞는 값을 가지고있을 것입니다. 이것은 함께 작동합니다 "A’B" 기본 인코딩에 대해 방해하지 않고 바이트를 맹목적으로 복사하기 때문입니다. 그러나 L"A’B", 구현 종속 인코딩 계수가 작동합니다. 아마도이 특정 문자를 위해 저장하기 위해 적절한 UTF-16 (Windows에있는 경우) 또는 UTF-32 ( *nix/mac에있는 경우) 값을 찾지 못할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top