2010-06-08 5 views
17

윈도우 _setmbcp 함수UTF-8이 "ANSI"코드 페이지로 허용되지 않는 이유는 무엇입니까?

OK, 지원하지 않는 UTF-7 차종 ( 지원되지 않는 UTF-7, UTF-8은 제외) ... 유효한 코드 페이지를 허용 의미 : 문자는 고유하지 않은 표현을 가지며 복잡성과 보안 위험을 초래합니다.

하지만 UTF-8을 사용하지 않는 이유는 무엇입니까?

"ANSI"버전의 Windows API 함수는 해당 인수를 UTF-16으로 변환하고 해당 "W"함수를 호출하고 출력의 모든 문자열을 "ANSI"로 변환합니다. 이것이 제가 수동으로 해왔 던 것입니다. 그렇다면 왜 Windows가 나를 대신 할 수 없습니까?

+3

CP65001은 UTF-8의 Windows 이름이라는 것을 알고 있습니까? 그것은 잘 설명되어 있지 않지만 예를 들어'WriteFile()'에 몇 가지 버그가 있지만 놀라 울 정도로 많은 곳에서 사용할 수 있습니다. – hippietrail

답변

9

"ANSI"코드 페이지는 기본적으로 유산입니다 : Windows 9X 시대. 최신 소프트웨어는 어쨌든 유니 코드 (즉, UTF-16)이어야합니다.

기본적으로 Ansi 코드 페이지 항목이 원래 디자인되었을 때 UTF-8은 발명되지 않았기 때문에 멀티 바이트 인코딩에 대한 지원이 다소 어려웠습니다 (대부분의 Ansi 코드 페이지는 일부 바이트 제외). 동양 코드 페이지는 1-2 바이트). "적절한"멀티 바이트 인코딩에 대한 지원을 추가하는 것은 모든 새로운 개발이 어쨌든 UTF-16에서 수행되어야 할 때 가치가없는 것으로 여겨졌습니다.

+15

모든 새로운 개발은 * Unicode *에 있어야한다는 것에 동의합니다. 하지만 UTF-16 대신 UTF-8을 사용하도록 제안 할 이유가있었습니다. (1) 우리 팀은 유니 코드를 인식하지 못하는 코드를 수백만 줄을 써서 누군가가 그것에 대해 신경 쓰지 않고, 이제는 모든 char 기반 문자열을 wchar_t 기반 문자열로 변경하려고 노력했습니다. (2) UTF-8을 선호하는 경향이있는 제품을 Linux로 이식 할 계획입니다. – dan04

5

_setmbcp()은 VC++ RTL 함수이며 Win32 API 함수가 아닙니다. RTL이 문자열을 해석하는 방법에만 영향을 미칩니다. Win32 API A 함수에는 아무런 영향을 미치지 않습니다. 내부적으로 W이라고 부르는 경우 A 함수는 항상 코드 페이지 0 (CP_ACP)을 지정하여 MultiByteToWideChar()WideCharToMultiByte()을 사용하여 변환에 시스템 기본 Ansi 코드 페이지를 사용합니다.

+0

Microsoft는 명시 적으로이 위치를 명시합니까? 그들이 정말로 이것을 수행한다면 ANSI 함수를 사용할 때 CP_UTF8을 사용하도록 런타임에 알리는 방법이 없어야하는 이유는 없습니다. – Calmarius

3

Microsoft의 국제화 전문가 인 Michael Kaplan은이 on his blog에 대답하려고 시도했습니다.

기본적으로 그의 설명은 Windows API 함수의 "ANSI"버전이 다른 코드 페이지를 처리하기위한 것이지만, 역사적으로 문자 인코딩에는 코드 포인트 당 최대 2 바이트가 필요하다는 암묵적인 기대가있었습니다. UTF-8은 그 기대치를 충족시키지 못했고, 이제 모든 기능을 변경하면 막대한 양의 테스트가 필요합니다.

+0

ANSI 코드 페이지는 Windows에서 2 바이트로 제한되지 않습니다. char의 진행은 SBCS -> DBCS -> MBCS 였고 wchar_t는 UCS2 -> UTF16이었습니다. MBCS가 UTF8 코드 페이지와 char을 사용하지 않는 이유가 없습니다. – evoskuil

+0

@evoskuil 코드 포인트 당 2 바이트 이상을 사용하는 Windows에서 지원하는 ANSI 코드 페이지의 예는 무엇입니까? AFAIK, Windows의 경우 MBCS는 DBCS (DBCS는 1 바이트 또는 2 바이트 문자를 의미 함)를 의미하며 http://msdn.microsoft.com/en-us/library/cwe8bzh0.aspx는이를 분명히 확인합니다. – jamesdlin

+1

[코드 페이지 식별자] (httpd // msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).asp) 나는 위의 게시 : 윈도우 XP 이상 : GB18030 중국어 간체 (4 바이트) 이 기준이 게시 상태를 : "모든 플랫폼에서 더블 바이트 문자 집합 (DBCS)이라는 멀티 바이트 문자 집합 (MBCS) 형식 지원." IOW는 DBCS라고하는 형식은 MBCS의 하위 집합입니다. 이것은 "모든 플랫폼"을위한 것입니다. 페이지에서 더 아래로보기 : "MBCS 지원 버전의 Windows 운영 체제에서 실행될 때 [도구는] MBCS를 완벽하게 지원합니다." – evoskuil

관련 문제