Answer
이것은 이전 답변입니다. UTF-8 Everywhere 는 최신 업데이트를 확인합니다.
의견 : 예, UTF-16은 유해한 것으로 간주되어야합니다 . 그것이 존재하는 바로 그 이유는 얼마 전 widechar가 현재 UCS-4가 될 것이라는 잘못된 믿음이 있었기 때문입니다.
UTF-8의 “anglo-centrism”에도 불구하고, 그것은 텍스트에 대한 유일한 유용한 인코딩으로 간주되어야합니다. 프로그램, 웹 페이지 및 XML 파일, OS 파일 이름 및 기타 컴퓨터 대 컴퓨터 텍스트 인터페이스의 소스 코드가 존재해서는 안된다고 주장 할 수 있습니다. 그러나 그렇게 할 때 텍스트는 인간 독자만을위한 것이 아닙니다.
반면 UTF-8 오버 헤드는 상당한 이점이 있지만 지불해야 할 적은 비용입니다. char*
로 문자열을 전달하는 인식되지 않는 코드와의 호환성과 같은 장점. 이것은 대단한 일입니다. UTF-8보다 UTF-16에서 더 짧은 유용한 문자는 거의 없습니다.
다른 모든 인코딩은 결국 죽을 것이라고 믿습니다. 여기에는 MS-Windows, Java, ICU, python이 포함됩니다. 오랜 연구와 토론 끝에 내 회사 의 개발 규칙은 OS API 호출을 제외한 모든 곳에서 UTF-16을 사용하는 것을 금지했으며 이는 중요성에도 불구하고 응용 프로그램의 성능과 Windows를 사용한다는 사실입니다. 변환 함수는 항상 가정 된 UTF8 std::string
를 Windows 자체가 올바르게 지원하지 않습니다 .
“ 필요한 곳에 필요한 것을 사용하세요 “라고 말하는 사람들에게 “모든 곳에서 동일한 인코딩을 사용하는 것은 큰 이점이 있으며, 특히 C ++에 wchar_t
를 추가하는 것은 실수라고 생각합니다. C ++ 0x에 유니 코드를 추가하는 것도 실수라고 생각합니다. STL 구현에서 요구해야하는 것은 모든 std::string
또는 char*
매개 변수는 유니 코드와 호환되는 것으로 간주됩니다.
또한 “ 사용에 반대합니다. 당신이 원하는 것 “접근. 그런 자유에 대한 이유가 없습니다. 텍스트 주제에 대한 충분한 혼란이있어서이 모든 소프트웨어가 손상되었습니다. 위에서 말했듯이, 저는 프로그래머가 마침내 UTF-8에 대한 합의를 하나의 적절한 방법으로해야한다고 확신합니다. (저는 ASCII를 사용하지 않는 국가에서 왔고 Windows에서 자랐기 때문에 마지막으로 종교적 근거에 따라 UTF-16을 공격 할 것으로 예상됩니다.)
더 많은 정보를 공유하고 싶습니다. Windows에서 텍스트를 작성하는 방법과 컴파일시 확인 된 유니 코드 정확성, 사용 용이성 및 코드의 더 나은 다중 플랫폼성에 대해 다른 모든 사람에게 권장하는 사항에 대해 설명합니다. 이 제안은 Windows에서 유니 코드를 사용하는 적절한 방법으로 일반적으로 권장되는 것과 상당히 다릅니다. 그러나 이러한 권장 사항에 대한 심층 연구 결과 동일한 결론이 나왔습니다. 따라서 다음과 같습니다.
인접한 지점이 아닌 다른 위치에서 wchar_t
또는 std::wstring
를 사용하지 마십시오. UTF-16을 허용하는 API.
_T("")
또는 L""
UTF-16 리터럴을 사용하지 마십시오 (이들은 IMO가 표준에서 제외되어야합니다. , UTF-16 지원 중단의 일부).
_UNICODE
상수에 민감한 유형, 함수 또는 파생어 (예 : LPTSTR
또는 CreateWindow()
.
그러나 _UNICODE
는 항상 정의되어 있습니다. 자동 컴파일되는 char*
문자열을 WinAPI에 전달하지 마십시오.
std::strings
및 char*
프로그램의 모든 위치는 UTF-8로 간주됩니다 (달리 언급되지 않은 경우).
내 모든 문자열은 std::string
이지만 char * 또는 문자열 리터럴을 convert(const std::string &)
.
와이드 문자를 허용하는 Win32 함수 만 사용합니다 (LPWSTR
). 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
with Utils::Convert
:
std::ifstream ifs(Utils::Convert("hello"), std::ios_base::in | std::ios_base::binary);
우리는 수동으로 fstream
에 대한 MSVC의 태도가 변경되면 변환을 제거하십시오.
이 코드는 다중 플랫폼이 아니므로 수동으로 변경해야 할 수 있습니다. 미래
자세한 내용은 fstream
유니 코드 조사 / 토론 사례 4215를 참조하세요.
UTF8이 아닌 콘텐츠로 텍스트 출력 파일을 생성하지 마십시오.
RAII / OOD 이유로 fopen()
를 사용하지 마십시오. 필요한 경우 위의 _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 }
댓글
답변
유니 코드 코드 포인트는 문자가 아닙니다! 때로는 글리프 (시각적 형식)가 아닙니다. .
몇 가지 예 :
“ⅲ”와 같은 로마 숫자 코드 포인트. ( “iii”처럼 보이는 단일 문자.)
단일 결합 된 문자 “\ u00e1″또는 문자와 분리 된 분음 부호 “\ u0061 \로 표현 될 수있는”á “와 같은 액센트 문자 u0301 “.
그리스어 소문자 시그마와 같은 문자. 단어 위치의 중간 (“σ “)과 끝 (“ς “)에 대해 서로 다른 형식을 갖지만 검색의 동의어로 간주되어야합니다.
유니 코드 임의 하이픈 U + 00AD. 컨텍스트에 따라 시각적으로 표시되거나 표시되지 않을 수 있으며 의미 검색에서는 무시됩니다.
유니 코드 편집을 얻는 유일한 방법 권리는 전문가가 작성한 라이브러리를 사용하거나 전문가가되어 직접 작성하는 것입니다. 코드 포인트 만 세고 있다면 죄의 상태에있는 것입니다.
댓글
답변 에 해당하는 사용자 인식 문자 입니다. h2>
유니 코드 변환 형식 (UTF)에 대해 사용할 수있는 간단한 규칙이 있습니다.-저장 및 통신을위한 utf-8-데이터 처리를위한 utf-16 사용하는 대부분의 플랫폼 API가 utf-32 (UNIX 세계에서 일반적) 인 경우 utf-32를 사용합니다.
오늘날 대부분의 시스템은 utf-16 (Windows, Mac OS, Java, .NET, ICU)을 사용합니다. , Qt). 다음 문서도 참조하세요. http://unicode.org/notes/tn12/
“UTF-16 as 유해”로 돌아 가기, 확실히 아닙니다.
대리자를 두려워하는 사람들 (유니 코드를 가변 길이 인코딩으로 변환한다고 생각)하는 사람들은 문자와 문자 간의 매핑을 만드는 다른 (훨씬 더 큰) 복잡성을 이해하지 못합니다. 매우 복잡한 유니 코드 코드 포인트 : 문자, 합자, 변형 선택기, 제어 문자 등을 결합합니다.
여기에서이 시리즈를 읽으십시오. http://www.siao2.com/2009/06/29/9800913.aspx 그리고 UTF-16이 어떻게 쉬운 문제가되는지 확인하십시오.
코멘트
답변
예, 물론입니다.
왜? 실행 코드 와 관련이 있습니다.
대규모 코퍼스에 대한 코드 포인트 사용 통계 를 살펴보면 Tom Christiansen에 의해 “BMP가 아닌 코드 포인트보다 크기가 더 큰 경우 트랜스 -8 비트 BMP 코드 포인트가 몇 차수 사용되는 것을 볼 수 있습니다.
2663710 U+002013 ‹–› GC=Pd EN DASH 1065594 U+0000A0 ‹ › GC=Zs NO-BREAK SPACE 1009762 U+0000B1 ‹±› GC=Sm PLUS-MINUS SIGN 784139 U+002212 ‹−› GC=Sm MINUS SIGN 602377 U+002003 ‹ › GC=Zs EM SPACE 544 U+01D49E ‹𝒞› GC=Lu MATHEMATICAL SCRIPT CAPITAL C 450 U+01D4AF ‹𝒯› GC=Lu MATHEMATICAL SCRIPT CAPITAL T 385 U+01D4AE ‹𝒮› GC=Lu MATHEMATICAL SCRIPT CAPITAL S 292 U+01D49F ‹𝒟› GC=Lu MATHEMATICAL SCRIPT CAPITAL D 285 U+01D4B3 ‹𝒳› GC=Lu MATHEMATICAL SCRIPT CAPITAL X
TDD dictum : “테스트되지 않은 코드는 깨어진 코드입니다.”라고 말하고 “실행되지 않은 코드는 깨어진 코드입니다”라고 바꾸고 프로그래머가 BMP가 아닌 코드 포인트를 얼마나 자주 처리해야하는지 생각해보세요.
UTF-16을 가변 너비 인코딩으로 처리하지 않는 것과 관련된 버그는 UTF-8 의 해당 버그보다 눈에 띄지 않을 가능성이 훨씬 큽니다. 일부 프로그래밍 언어는 여전히 UCS-2 대신 UTF-16을 제공한다고 보장하지 않습니다. 일부 고급 프로그래밍 언어는 코드 포인트 대신 코드 단위에 대한 액세스를 제공합니다 (C조차도 사용하는 경우 코드 포인트에 대한 액세스를 제공합니다. wchar_t
, 어떤 플랫폼이든
코멘트
Answer
UTF-16이 유해한 것으로 간주 될 수 있다고 생각하면 유니 코드에 대한 더 많은 이해 가 필요하다고 생각합니다.
주관적인 질문에 대한 내 의견을 제시하기 위해 반대 투표를 받았으므로 자세히 설명해 드리겠습니다. UTF-16에 대해 정확히 무엇을 괴롭히는가? 모든 것이 UTF-8로 인코딩 된 경우 선호합니까? UTF-7? 또는 물론 UCS-4는 어떻습니까? 물론 특정 응용 프로그램이 모든 단일 문자 코드를 처리하도록 설계되지는 않았지만 특히 오늘날의 글로벌 정보 도메인에서 국제 경계 간의 통신에 필요합니다.
하지만 실제로 UTF-16이 혼란 스럽거나 부적절하게 구현 될 수 있기 때문에 해로운 것으로 간주되어야한다고 생각한다면 (유니 코드는 확실히 가능할 수 있음), 어떤 문자 인코딩 방법이 해롭지 않은 것으로 간주 될까요?
편집 : 명확히하기 위해 : 표준의 부적절한 구현을 표준 자체의 품질을 반영하는 것으로 간주하는 이유는 무엇입니까? 다른 사람들이 나중에 언급했듯이 응용 프로그램이 도구를 부적절하게 사용한다고해서 해당 도구를 의미하지는 않습니다. 그 자체로 결함이있는 것입니다. 그렇다면 “var 키워드가 유해한 것으로 간주 됨”또는 “스레딩이 유해한 것으로 간주 됨”과 같은 말을 할 수 있습니다.이 질문은 많은 프로그래머가 구현하는 데 어려움을 겪는 표준의 품질과 특성을 혼동한다고 생각합니다. 올바르게 사용하는 것은 유니 코드 자체가 아니라 유니 코드의 작동 방식을 이해하지 못하기 때문이라고 생각합니다.
댓글
Answer
Utf-에는 아무런 문제가 없습니다. 16 인코딩. 그러나 16 비트 단위를 문자로 취급하는 언어는 잘못 설계된 것으로 간주되어야합니다. 항상 문자를 나타내지 않는 “char
“라는 유형을 갖는 것은 매우 혼란 스럽습니다. 대부분의 개발자는 문자 유형이 코드 포인트 또는 문자를 나타낼 것으로 예상하기 때문에 BMP 이외의 문자에 노출되면 많은 코드가 손상 될 수 있습니다.
그러나 utf-32를 사용한다고해서 각각의 32를 의미하지는 않습니다. 비트 코드 포인트는 항상 문자를 나타냅니다. 문자 결합으로 인해 실제 문자는 여러 코드 포인트로 구성 될 수 있습니다. 유니 코드는 결코 사소한 것이 아닙니다.
BTW. 문자가 8 비트 일 것으로 예상하는 플랫폼 및 애플리케이션에는 Utf-8이 제공되는 동일한 종류의 버그가있을 수 있습니다.
댓글
답변
내 개인적인 선택은 항상 UTF-8을 사용합니다. 거의 모든 것을위한 Linux의 표준이며 많은 레거시 앱과 역 호환됩니다. 라틴 문자가 아닌 문자와 다른 UTF 형식에 사용되는 추가 공간 측면에서 최소한의 오버 헤드가 있으며 라틴 문자의 공간을 크게 절약 할 수 있습니다. 웹에서 라틴어가 가장 우세하며 가까운 미래에 그럴 것이라고 생각합니다. 그리고 원래 게시물의 주요 주장 중 하나를 다루기 위해 거의 모든 프로그래머가 UTF-8에 때때로 다중 바이트 문자가 있음을 알고 있습니다. 모든 사람이 이것을 올바르게 다루는 것은 아니지만 일반적으로 UTF-16에 대해 말할 수있는 것보다 더 많은 것을 알고 있습니다. 그러나 물론 응용 프로그램에 가장 적합한 것을 선택해야합니다. 이것이 바로 처음에 두 개 이상이있는 이유입니다.
댓글
이 이것이 널리 사용되는 이유입니다. 하지만 저는 ' UTF-8의 팬이기도합니다. 또한 바이트 순서에 문제가 없으므로 이점이 있습니다.
이론적으로는 그렇습니다. 실제로는 UTF-16BE와 같은 것이 있는데, 이는 BOM이없는 빅 엔디안에서 UTF-16을 의미합니다. 이것은 내가 만든 것이 아닙니다. 이것은 ID3v2.4 태그에서 허용되는 실제 인코딩입니다 (ID3v2 태그는 안타깝지만 안타깝게도 널리 사용됩니다). 이러한 경우 텍스트 자체에 BOM이 포함되어 있지 않으므로 ' 외부에서 엔디안을 정의해야합니다. UTF-8은 항상 단방향으로 작성되며 ' 이러한 문제가 없습니다.
아니요, UTF-16은 더 간단하지 않습니다. 더 어렵습니다. 고정 된 너비라고 생각하도록 오도하고 속입니다. 너무 늦을 때까지 눈치 채지 못하기 때문에 그러한 모든 코드가 깨졌습니다. CASE IN POINT : 어제 Java 코어 라이브러리에서 또 다른 어리석은 UTF-16 버그를 발견했습니다. 이번에는 String.equalsIgnoreCase에서 UCS-2 브레인 데스 버그에 남겨져 16/17 유효한 유니 코드 코드 포인트에서 실패했습니다. 그 코드는 얼마나 오래 있었습니까? 버그가 있다고 변명 할 수 없습니다. UTF-16은 순전히 어리 석음과 사고가 일어나기를 기다리고 있습니다. UTF-16에서 screaming을 실행합니다.
@tchrist UTF-16이 고정 길이가 아니라는 것을 알지 못하려면 매우 무지한 개발자 여야합니다. Wikipedia로 시작하면 맨 위에 다음 내용이 표시됩니다. " 코드 포인트 당 1 개 또는 2 개의 16 비트 코드 단위의 가변 길이 결과를 생성합니다. ". 유니 코드 FAQ는 동일하게 설명합니다 : unicode.org/faq//utf_bom.html#utf16-1 . 저는 ' 어떻게 UTF-16이 가변 길이로 쓰여진 모든 사람을 속일 수 있는지 모릅니다. 방법은 UTF-16 용으로 설계되지 않았으며 ' 유니 코드로 간주되어서는 안됩니다.
@tchrist 통계 소스? 좋은 프로그래머는 드물지만 우리가 더 가치있게되기 때문에 이것이 좋다고 생각합니다. 🙂 Java API의 경우 문자 기반 부분은 결국 더 이상 사용되지 않을 수 있지만 이것이 사용되지 않는다는 보장은 없습니다 '. 그리고 확실히 ' 컴플라이언스 이유로 제거되지 않았습니다.
답변
글쎄, 고정 크기 기호를 사용하는 인코딩이 있습니다. 확실히 UTF-32를 의미합니다. 하지만 각 심볼에 4 바이트가 낭비되는 공간이 너무 많습니다. 일상적인 상황에서 왜 사용합니까?
내 생각에 대부분의 문제는 일부 소프트웨어가 떨어 졌다는 사실에서 나타납니다. 유니 코드 표준에 뒤처졌지만 상황을 신속하게 수정하지는 못했습니다. Opera, Windows, Python, Qt-모두 UTF-16이 널리 알려 지거나 존재하기 전에 나타났습니다. 그래도 Opera, Windows Explorer 및 Notepad에서 BMP 외부의 문자에 더 이상 문제가 없음을 확인할 수 있습니다 (적어도 내 PC에서는). 그러나 어쨌든 프로그램이 서로 게이트 쌍을 인식하지 못하면 UTF-16을 사용하지 않습니다. 이러한 프로그램을 다룰 때 어떤 문제가 발생하더라도 UTF-16 자체와는 아무런 관련이 없습니다.
그러나 BMP 만 지원하는 레거시 소프트웨어의 문제는 다소 과장된 것 같습니다. BMP 외부의 문자는 매우 특정한 경우와 영역에서만 발생합니다. 유니 코드 공식 FAQ 에 따르면 “동아시아 텍스트에서도 대리 쌍의 발생률은 평균적으로 모든 텍스트 저장 용량의 1 % 미만이어야합니다”.물론 BMP 외부의 문자는 프로그램이 유니 코드를 준수하지 않기 때문에 무시해서는 안됩니다 . 그러나 대부분의 프로그램은 그러한 문자를 포함하는 텍스트 작업을위한 것이 아닙니다. 그것을 지원하지 않으면, 그것은 불쾌하지만 이증은 아닙니다.
이제 대안을 고려해 봅시다. UTF-16이 존재하지 않았다면 비 ASCII 텍스트에 적합한 인코딩이 없을 것이며 UCS-2 용으로 생성 된 모든 소프트웨어는 유니 코드 호환을 유지하기 위해 완전히 재 설계되어야합니다. 후자는 유니 코드 채택을 늦출 가능성이 큽니다. 또한 ASCII와 관련하여 UTF-8이하는 것처럼 UCS-2의 텍스트와의 호환성을 유지할 수 없었을 것입니다.
이제 모든 레거시 문제를 제쳐두고 인코딩에 대한 주장은 무엇입니까? 나는 요즘 개발자들이 UTF-16이 가변 길이라는 것을 모르고 Wikipedia와 함께 모든 곳에서 작성된다는 것을 정말로 의심합니다. 누군가가 복잡성을 가능한 문제로 지적했다면 UTF-16은 UTF-8보다 구문 분석하기가 훨씬 덜 어렵습니다. 또한 UTF-16에서만 문자열 길이를 결정하는 것이 엉망이라고 생각하는 것도 잘못되었습니다. UTF-8 또는 UTF-32를 사용하는 경우에도 하나의 유니 코드 코드 포인트가 “반드시 한 문자를 의미하는 것은 아닙니다. 그 외에는 인코딩에 큰 영향을 미치지 않는다”고 생각합니다.
그러므로 인코딩 자체가 유해한 것으로 간주해서는 안된다고 생각합니다. UTF-16은 단순성과 간결함 사이의 절충안이며 필요한 곳에 필요한 것을 사용하여 해가 없습니다 . 어떤 경우에는 ASCII와의 호환성을 유지해야하고 UTF-8이 필요합니다. 어떤 경우에는 Han 표의 문자로 작업하고 UTF-16을 사용하여 공간을 절약하기를 원합니다. 어떤 경우에는 고정 된 문자를 사용하는 보편적 인 표현이 필요합니다. 길이 인코딩입니다. 더 적절한 것을 사용하고 올바르게 수행하십시오.
댓글
li>
사실 저는 ' 러시아 출신이고 내 프로그램을 포함하여 항상 키릴 문자를 접하므로 ' 내가 앵글로 중심의 시각을 가지고 있다고 생각합니다. 🙂 ASCII를 언급하는 것은 적절하지 않습니다. ' 유니 코드가 아니고 특정 문자를 지원하지 않기 때문입니다 '. UTF-8, UTF-16, UTF-32는 동일한 국제 문자 집합을 지원하며 특정 영역에서 사용하기위한 것입니다. 그리고 이것이 바로 제 요점입니다. 주로 영어를 사용하는 경우 UTF-8을 사용하고, 주로 키릴 문자를 사용하는 경우 UTF-16을 사용하고, 고대 언어를 사용하는 경우 UTF-32를 사용합니다. 아주 간단합니다.
" 사실이 아닙니다. 일본어, 중국어 또는 아랍어와 같은 아시아 문자도 BMP에 속합니다. BMP 자체는 실제로 매우 크고 확실히 오늘날 사용되는 모든 스크립트를 포함 할 수있을만큼 큽니다. " 이것은 모두 잘못되었습니다. BMP에는 0xFFFF 문자 (65536)가 포함됩니다. 중국어만으로는 그 이상이 있습니다. 중국 표준 (GB 18030)에는 그 이상이 있습니다. 유니 코드 5.1은 이미 100,000 개 이상의 문자를 할당했습니다.
@Marcolm : " BMP 자체는 실제로 매우 크고 확실히 오늘날 사용되는 모든 스크립트를 포함 할만큼 충분히 큽니다. " 사실이 아닙니다. 이 시점에서 유니 코드는 이미 BMP보다 더 많은 문자를 수용 할 수있는 약 100,000 개의 문자를 할당했습니다. BMP 외부에는 많은 한자가 있습니다. 그리고 그들 중 일부는 GB-18030 (필수 중국어 표준)에 의해 요구됩니다. 기타는 일본 및 한국 표준 (필수 아님)에서 요구합니다. 따라서 이러한 시장에서 제품을 판매하려면 BMP 지원 이상의 것이 필요합니다.
UTF-16을 사용하지만 좁은 BMP 문자 만 처리 할 수있는 모든 것은 실제로 UTF-16을 사용하지 않습니다. 버그가 많고 부서졌습니다. OP의 전제는 건전합니다. UTF-16은 해 롭습니다. 이는 사람들이 손상된 코드를 작성하도록 유도하기 때문입니다. ï 유니 코드 텍스트를 처리 할 수 있거나 처리 할 수 없습니다. 그렇게 할 수 없다면 ASCII 전용 텍스트 처리만큼 어리석은 하위 집합을 선택하는 것입니다.
Answer
특히 동아시아 언어에 대한 Windows 국제화 작업은 저를 손상 시켰을 수도 있지만, 프로그램 내부에서 문자열을 표현하는 경우 UTF-16을, 일반 텍스트의 네트워크 또는 파일 저장을 위해서는 UTF-8을 선호합니다. 문서처럼. 그러나 UTF-16은 일반적으로 Windows에서 더 빠르게 처리 될 수 있으므로 Windows에서 UTF-16을 사용할 때의 주요 이점입니다.
UTF-16으로 도약하면 평균 제품 처리의 적절성이 크게 향상되었습니다. 국제 텍스트.대리 쌍을 고려해야하는 좁은 경우 (기본적으로 삭제, 삽입 및 줄 바꿈)가 거의 없으며 평균 사례는 대부분 직선 통과입니다. 그리고 JIS 변형과 같은 이전 인코딩과 달리 UTF-16은 서로 게이트 쌍을 매우 좁은 범위로 제한하므로 검사가 정말 빠르고 앞뒤로 작동합니다.
그렇습니다. 인코딩 된 UTF-8도 있습니다. 그러나 서로 게이트 쌍을 두 개의 UTF-8 시퀀스로 잘못 인코딩하는 고장난 UTF-8 응용 프로그램도 많이 있습니다. 따라서 UTF-8은 “구원”도 보장하지 않습니다.
IE는 일반적으로 UTF-8 페이지에서 내부 UTF-16 표현으로 변환하는 경우에도 2000 년 이후로 서로 게이트 쌍을 합리적으로 잘 처리합니다. “Firefox도 제대로 작동한다고 확신하므로 Opera가 무엇을하는지에 대해서는 신경 쓰지 않습니다.
UTF-32 (UCS4라고도 함)는 공간을 많이 차지하기 때문에 대부분의 응용 프로그램에서 의미가 없습니다. 그래서 그것은 거의 시작하지 않습니다.
댓글
답변
UTF-8은 확실히 갈 길입니다. 내부 용 UTF-32가 동반 될 수 있습니다. 고성능 랜덤 액세스가 필요한 알고리즘에서 사용합니다 (그러나 결합 문자를 무시 함).
UTF-16 및 UTF-32 (LE / BE 변형 포함) 모두 엔디 어 니스 문제가 발생합니다. 외부에서 사용하지 마십시오.
설명
답변
UTF-16? 확실히 해 롭습니다. 여기에 내 생각에 불과하지만 프로그램의 텍스트에 대해 정확히 세 가지 인코딩이 허용됩니다.
댓글
에서 MessageBoxW
로. 대신 UNICODE
정의가 후자를 처리합니다. 증명을 위해 이것은 MS Visual Studio 2005의 WinUser.h
헤더에서 가져온 것입니다.
#ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif // !UNICODE
최소한, 이 오류는 utf8everywhere.org
에서 수정해야합니다.
제안 :
아마도 가이드에는 Wide- 데이터 구조의 문자열 버전을 사용하여 놓치고 잊어 버리기 쉽게 만듭니다.Wide-string 버전의 함수를 사용하는 것 외에도 Wide-string 버전의 데이터 구조를 사용하면 이러한 함수의 ANSI 문자열 버전을 실수로 호출 할 가능성이 훨씬 줄어 듭니다.
예제 예 :
WIN32_FIND_DATAW data; // Note the W at the end. HANDLE hSearch = FindFirstFileW(widen("*.txt").c_str(), &data); if (hSearch != INVALID_HANDLE_VALUE) { FindClose(hSearch); MessageBoxW(nullptr, data.cFileName, nullptr, MB_OK); }
댓글