타이포그래피 apostrophe+wide 줄 문자 그럴은 내 Wofstream (C ++)을 깨뜨 렸습니다.
-
03-07-2019 - |
문제
타자기 아포스트로피 ( ')가 아니라 불길한 타이포그래피 아포스트로피 (')를 다룰 때 이상한 행동이 발생했습니다. 넓은 문자열 문자와 함께 사용되는 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에있는 경우) 값을 찾지 못할 것입니다.