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); } 

댓글

  • 동의합니다. 감사! 문서를 업데이트하겠습니다. 문서에는 여전히 더 많은 개발과 데이터베이스에 대한 정보가 필요합니다. 우리는 문구의 기여를 기쁘게 생각합니다.
  • @PavelRadzivilovsky _UNICODE는 아직 거기에 있습니다 : (
  • 알려 주셔서 감사합니다. cubus, Jelle, SVN의 사용자를 원하십니까?
  • @Pavel 물론 감사합니다!
  • @JelleGeerts : 지연에 대해 사과드립니다. 언제든지 이메일 (링크 선언문) 또는 Facebook에서 찾을 수 있습니다. 여기에서 가져온 문제를 해결했다고 믿고 있습니다 (그리고 여기에서 여러분을 인정했습니다). UTF-8 대 UTF-16 논쟁은 여전히 관련이 있습니다. 해당 비공개 채널을 통해 언제든지 문의 해주세요.

답변

누군가 UCS4 및 UTF-32가 아뇨,하지만 무슨 뜻인지 알아요.하지만 그들 중 하나는 다른 하나의 인코딩입니다. 나는 그들이 “처음부터 엔디안을 지정하려고 생각했기 때문에 여기서도 엔디안 전투가 벌어지지 않았 으면합니다.” 그들이 오는 것을 보지 못했습니까? 적어도 UTF-8은 모든면에서 동일합니다. re (누군가가 6 바이트의 원래 사양을 따르지 않는 한)

UTF-16을 사용하는 경우 멀티 바이트 문자 처리를 포함하도록 있어 있습니다. 2N을 바이트 배열로 인덱싱하여 N 번째 문자로 이동할 수 없습니다. 따라 가거나 문자 인덱스를 가져야합니다. 그렇지 않으면 버그를 작성했습니다.

현재 C ++의 초안 사양은 다음과 같습니다. UTF-32 및 UTF-16은 리틀 엔디안, 빅 엔디안 및 지정되지 않은 변형을 가질 수 있습니다. 정말? 유니 코드가 모든 사람이 처음부터 리틀 엔디안을해야한다고 명시했다면 모두 더 간단했을 것입니다. (저도 빅 엔디안으로도 괜찮 았을 것입니다.) 대신 어떤 사람들은이를 한 가지 방식, 다른 방식으로 구현했고 이제는 어리석은 일에 갇혀 있습니다. 때로는 소프트웨어 엔지니어가되는 것이 부끄럽습니다.

주석

  • 지정되지 않은 endianess는 문자열을 읽는 방법을 결정하는 데 사용되는 첫 번째 문자로 BOM을 포함해야합니다. UCS-4와 UTF-32는 오늘날 실제로 동일합니다. 즉, 32 비트 정수에 저장된 0과 0x10FFFF 사이의 숫자 UCS 값입니다.
  • @Tronic : 기술적으로 이것은 사실이 아닙니다. UCS-4는 32 비트 정수를 저장할 수 있지만 UTF-32는 0xFFFF, 0xFFFE 및 모든 서로 게이트와 같이 교환에 적합하지 않은 비 문자 코드 포인트를 저장하는 것이 금지됩니다. UTF는 내부 인코딩이 아니라 전송 인코딩입니다.
  • 다른 프로세서가 다른 바이트 순서를 계속 사용하는 한 엔디안 문제는 피할 수 없습니다. 그러나 UTF-16의 파일 저장을 위해 " 선호 된 " 바이트 순서가 있다면 좋았을 것입니다.
  • UTF-32는 코드 포인트 의 경우 고정 너비이지만 문자 의 경우 고정 너비가 아닙니다. (" 문자 결합 "이라는 이름을 들었습니까?) 따라서 ' 단순히 4N을 바이트 배열로 인덱싱하여 N ' 번째 문자 로 변환합니다.

Answer

개발자가 충분히주의하면 해롭다 고 생각하지 않습니다.
그리고 그들도 잘 알고 있다면이 트레이드 오프를 받아 들여야합니다.

일본 소프트웨어 개발자로서 UCS-2가 충분히 크고 공간을 제한하면 논리가 단순화되고 런타임 메모리가 감소하므로 UCS-2 제한 하에서 utf-16을 사용하는 것으로 충분합니다.

코드 포인트와 바이트가 비례한다고 가정하는 파일 시스템 또는 기타 응용 프로그램이 있으므로 원시 코드 포인트 번호가 일부 고정 크기 저장소에 맞도록 보장 할 수 있습니다.

한 가지 예는 UCS-2 를 파일 이름 저장소 인코딩으로 지정하는 NTFS 및 VFAT입니다.

이 예제가 실제로 UCS-4를 지원하도록 확장하려는 경우 어쨌든 모든 것에 utf-8을 사용하는 데 동의 할 수 있지만 고정 길이에는 다음과 같은 좋은 점이 있습니다.

  1. can 길이에 따른 크기 보장 (데이터 크기 및 코드 포인트 길이는 비례)
  2. 해시 조회에 인코딩 번호를 사용할 수 있음
  3. 압축되지 않은 데이터의 크기가 적당합니다 (utf-32 / UCS-4)

장래에 내장 된 모든 장치에서도 메모리 / 처리 능력이 저렴할 때 추가 캐시 누락 또는 페이지 오류 및 추가 메모리로 인해 장치가 약간 느려질 수 있습니다. 하지만 가까운 시일 내에는 이런 일이 일어나지 않을 것 같습니다 …

댓글

  • 이 댓글을 읽는 사람들에게는 UCS- 2는 UTF-16과 동일하지 않습니다. 이해하기 위해 차이점을 찾아보십시오.

답변

“가장 인기있는 인코딩, UTF-16은 유해한 것으로 간주됩니까? “

상당히 가능하지만 대안이 반드시 훨씬 더 나은 것으로 간주해서는 안됩니다.

근본적인 문제는 글리프, 문자, 코드 포인트 및 바이트 시퀀스에 대한 다양한 개념이 있다는 것입니다. 이들 각각 사이의 매핑은 정규화 라이브러리를 사용하더라도 사소하지 않습니다. (예를 들어, 라틴 기반 스크립트로 작성된 유럽 언어의 일부 문자는 단일 유니 코드 코드 포인트로 작성되지 않습니다. 이는 복잡성의 끝에서 더 간단합니다!) 이것이 의미하는 것은 모든 것을 올바르게 얻는다는 것입니다. 놀랍게도 매우 어렵습니다. 기괴한 버그가 예상됩니다 (여기서 버그에 대해 신음하는 대신 해당 소프트웨어의 관리자에게 알리십시오).

UTF- 예를 들어, UTF-8은 BMP 외부에서 코드 포인트를 인코딩하는 다른 방식 (대리자 쌍으로)이 있다는 것과는 반대로 유해한 것으로 간주 될 수 있습니다. 코드가 코드 포인트별로 액세스하거나 반복하려는 경우, OTOH는 “문자”를 가정하는 기존 코드의 상당 부분이 항상 2 바이트 수량에 맞출 수 있음을 의미합니다. 최소한 모든 것을 재건하지 않고 계속 작업합니다. 즉, 최소한 해당 캐릭터를 “올바르게 처리되지 않는 것입니다!

나는 당신의 질문을 머릿속으로 돌리고 유니 코드의 망할 쉿 뱅이 해로운 것으로 간주되어야하며 모든 사람이 8 비트 인코딩을 사용해야한다고 말하고 싶습니다. 나는 (지난 20 년 동안) 그것이 어디로 이끄는지를 보았다 : 다양한 ISO 8859 인코딩에 대한 끔찍한 혼란과 키릴 문자와 EBCDIC 제품군에 사용되는 전체 세트, 그리고… 음, 모든 결함에 대한 유니 코드가 . “다른 나라들 사이에 그렇게 심한 타협”이 아니었다면 오해가 있습니다.

댓글

  • 우리의 행운을 알면서 몇 년 안에 ' UTF-16에서 공간이 부족하다는 것을 알게됩니다. Meh.
  • 근본적인 문제는 텍스트가 믿을 수 없을 정도로 어렵다는 것입니다. 해당 정보를 디지털 방식으로 표현하는 방법은 복잡 할 수 없습니다. '은 날짜가 어렵고, 달력이 어렵고, 시간이 어렵고, 개인 이름이 어렵고, 우편 주소가 어렵다는 것과 동일한 이유입니다. 디지털 기계가 인간의 문화적 구성물과 교차 할 때마다 복잡함 분출. 그것은 삶의 사실입니다. 인간은 디지털 로직에서 작동하지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다