이것은 오래된 대답입니다. 최신 업데이트는 UTF-8 Everywhere 를
참조하십시오 .
의견 : 예, UTF-16은 유해한 것으로 간주해야합니다 . 그것이 존재하는 이유는 얼마 전에 widechar가 UCS-4가 될 것이라고 오도 된 믿음이 있었기 때문입니다.
UTF-8의 "anglo-centrism"에도 불구하고 텍스트에 유일하게 유용한 인코딩으로 간주되어야합니다. 프로그램의 소스 코드, 웹 페이지 및 XML 파일, OS 파일 이름 및 기타 컴퓨터 간 텍스트 인터페이스는 존재하지 않았어야한다고 주장 할 수 있습니다. 그러나 그들이 할 때 텍스트는 인간 독자만을위한 것이 아닙니다.
반면, UTF-8 오버 헤드는 지불해야하는 비용이 적지 만 상당한 이점이 있습니다. 로 문자열을 전달하는 알지 못하는 코드와의 호환성과 같은 장점 char*
. 이것은 좋은 일입니다. UTF-8보다 SHUTTER 인 유용한 문자는 UTF-8보다 적습니다.
다른 모든 인코딩은 결국 죽을 것이라고 믿습니다. 이것은 MS-Windows, Java, ICU, python이 그것을 좋아하는 것으로 사용하지 않는 것을 포함합니다. 오랜 연구와 토론 끝에 회사 의 개발 규칙은 OS API 호출을 제외한 모든 곳에서 UTF-16을 사용하는 것을 금지했으며 이는 응용 프로그램의 성능의 중요성과 Windows를 사용한다는 사실에도 불구하고 마찬가지입니다. 항상 가정 된 UTFF8 std::string
을 기본 UTF-16 으로 변환하기 위해 변환 기능이 개발되었으며 , Windows 자체 가 제대로 지원하지 않습니다 .
" 필요한 곳에 필요한 것을 사용하십시오 "라고 말하는 사람들에게는 모든 곳에서 동일한 인코딩을 사용하는 데 큰 이점이 있으며 그렇지 않으면 다른 이유가 없습니다. 특히 wchar_t
C ++에 추가 하는 것은 실수 라고 생각하고 C ++ 0x에 유니 코드를 추가 한 것도 마찬가지입니다. STL 구현에서 요구해야 할 것은 모든 std::string
또는 char*
매개 변수가 유니 코드 호환으로 간주 된다는 것입니다.
또한 " 원하는 것을 사용하십시오 "접근 방식 에 위배 됩니다. 나는 그러한 자유의 이유가 없다. 텍스트의 주제에 대해 혼동이 많으므로이 모든 깨진 소프트웨어가 생깁니다. 위에서 말했듯이, 프로그래머는 UTF-8에 대한 적절한 합의에 따라 합의에 도달해야한다고 확신합니다. (나는 ASCII가 아닌 국가에서 왔으며 Windows에서 자랐으므로 마지막으로 종교적 근거를 기반으로 UTF-16을 공격 할 것으로 예상됩니다).
Windows에서 텍스트를 작성하는 방법과 컴파일 타임 검사 된 유니 코드 정확성, 사용 편의성 및 코드의 다중 플랫폼 향상을 위해 다른 사람들에게 권장하는 것에 대한 자세한 정보를 공유하고 싶습니다. 이 제안은 Windows에서 유니 코드를 사용하는 적절한 방법으로 일반적으로 권장되는 것과 다릅니다. 그러나 이러한 권장 사항에 대한 심도있는 연구를 통해 동일한 결론을 얻었습니다. 그래서 여기에 간다 :
- UTF-16을 허용하는 API에 인접한 점 이외의 곳을 사용
wchar_t
하거나 std::wstring
다른 곳에서 사용하지 마십시오 .
- 사용하지 마십시오
_T("")
또는 L""
UTF-16 리터럴은 (이러한 IMO UTF-16 중단의 일환으로, 표준에서주의해야한다).
- 유형, 함수 또는에 민감한 이들의 유도체 사용하지 마십시오
_UNICODE
과 같은 상수, LPTSTR
또는 CreateWindow()
.
- 그러나 WinAPI에 문자열을 자동 컴파일
_UNICODE
하는 것을 피하기 위해 항상 정의char*
std::strings
그리고 char*
어디 프로그램에서 UTF-8로 간주됩니다 (그렇지 않으면 말했다하지 않은 경우)
std::string
char * 또는 string literal을에 전달할 수 는 있지만 모든 문자열은 convert(const std::string &)
입니다.
widechars ( LPWSTR
) 를 허용하는 Win32 함수 만 사용하십시오 . LPTSTR
또는을 ( 를) 수락하는 사람은 절대 아닙니다 LPSTR
. 이 방법으로 매개 변수를 전달하십시오.
::SetWindowTextW(Utils::convert(someStdString or "string litteral").c_str())
(정책은 아래의 변환 기능을 사용합니다.)
MFC 문자열로 :
CString someoneElse; // something that arrived from MFC. Converted as soon as possible, before passing any further away from the API call:
std::string s = str(boost::format("Hello %s\n") % Convert(someoneElse));
AfxMessageBox(MfcUtils::Convert(s), _T("Error"), MB_OK);
Windows에서 파일, 파일 이름 및 fstream으로 작업 :
- 가족 에게 인수를 전달
std::string
하거나 const char*
파일 이름을 지정 하지 마십시오 fstream
. MSVC STL은 UTF-8 인수를 지원하지 않지만 비표준 확장명을 가지며 다음과 같이 사용해야합니다.
std::string
로 다음 std::wstring
과 Utils::Convert
같이 인수를 변환하십시오 .
std::ifstream ifs(Utils::Convert("hello"),
std::ios_base::in |
std::ios_base::binary);
MSVC의 태도가 fstream
바뀔 때 변환을 수동으로 제거해야합니다 .
- 이 코드는 다중 플랫폼이 아니며 나중에 수동으로 변경해야 할 수도 있습니다
- 자세한 정보는
fstream
유니 코드 리서치 / 토론 사례 4215를 참조하십시오.
- 비 UTF8 컨텐츠로 텍스트 출력 파일을 생성하지 마십시오
fopen()
RAII / OOD 이유로 사용하지 마십시오 . 필요한 경우 _wfopen()
위의 WinAPI 규칙을 사용하십시오 .
// For interface to win32 API functions
std::string convert(const std::wstring& str, unsigned int codePage /*= CP_UTF8*/)
{
// Ask me for implementation..
...
}
std::wstring convert(const std::string& str, unsigned int codePage /*= CP_UTF8*/)
{
// Ask me for implementation..
...
}
// Interface to MFC
std::string convert(const CString &mfcString)
{
#ifdef UNICODE
return Utils::convert(std::wstring(mfcString.GetString()));
#else
return mfcString.GetString(); // This branch is deprecated.
#endif
}
CString convert(const std::string &s)
{
#ifdef UNICODE
return CString(Utils::convert(s).c_str());
#else
Exceptions::Assert(false, "Unicode policy violation. See W569"); // This branch is deprecated as it does not support unicode
return s.c_str();
#endif
}