2012-11-21 2 views
4

동일한 유니 코드 (표준화 됨) table의 다른 인코딩이 있습니다. 예를 들어 UTF-8 인코딩의 경우 Acorresponds to0x0041이지만 UTF-16 인코딩의 경우 Arepresented as0xfeff0041입니다.유니 코드 인코딩 (UTF-8, UTF-16, 기타)은 Windows에서 유니 코드 데이터 형식으로 사용합니까?

From this brilliant article 나는 C++ for Windows 플랫폼에서 프로그래밍 할 때 Unicode를 처리 할 때 2 바이트로 표시된다는 것을 알아야한다는 것을 알게되었습니다. 그러나 그것은 인코딩에 대해 아무 말도하지 않습니다. (심지어 x86 CPU는 리틀 엔디안이기 때문에 두 바이트가 메모리에 저장되는 방법을 알고 있습니다.) 그러나 유니 코드의 인코딩도 알고 있어야 심볼이 메모리에 저장되는 방법에 대한 완전한 정보를 얻을 수 있습니다. C++/Windows 프로그래머를위한 고정 유니 코드 인코딩이 있습니까?

+8

'A'는 ** UTF-16에서 '0xfeff0041'로 표시되지 않습니다 **. 그것은 UTF-8에서는'0x41'이고, UTF-16에서는'0x0041'입니다. –

+0

http://www.fileformat.info/info/charset/UTF-16/list.htm 여기에서 이미 언급 한 것처럼 내 정보의 출처입니다. 어떻게 저장 되나요? – Narek

+4

소스가 잘못되었습니다. 이 값들은 모두 앞에 feff가 있어서는 안됩니다. '0xFEFF'는 UTF-16 BOM으로 사용됩니다. –

답변

12

Windows 용 메모리에 저장된 값은 항상 UTF-16 little-endian입니다. 그러나 그것은 당신이 말하는 내용이 아닙니다. 당신은 파일 내용을보고 있습니다. Windows 자체는 파일의 인코딩을 지정하지 않고 개별 응용 프로그램에 남겨 둡니다.

파일 시작 부분에 표시되는 0xfe 0xff는 Byte Order Mark or BOM입니다. 파일이 유니 코드 일 가능성이 높을뿐만 아니라 유니 코드 인코딩의 변형을 알려줍니다.

0xfe 0xff  UTF-16 big-endian 
0xff 0xfe  UTF-16 little-endian 
0xef 0xbb 0xbf UTF-8 

BOM이없는 파일은 작성 방법을 모르는 경우 8 비트 문자로 간주해야합니다. 그것은 UTF-8 또는 다른 Windows 문자 인코딩 인 경우에도 여전히 알려주지 않습니다. 추측 해 보면됩니다.

이 작업을 수행하는 방법의 예로 메모장을 사용할 수 있습니다. 파일에 BOM이 있으면 메모장에서 BOM을 읽고 내용을 적절하게 처리합니다. 그렇지 않으면 "인코딩"드롭 다운 목록에서 직접 코딩을 지정해야합니다.

편집 : Windows 설명서가 인코딩에 대해 더 구체적이지 않은 이유는 Windows가 유니 코드를 매우 얼리 어답터로 사용했기 때문에 당시는 only one encoding of 16 bits per code point이었습니다. 65536 코드 포인트가 부적절한 것으로 판명되면, 범위를 확장하는 방법으로 서로 게이트 쌍이 발명되었고 UTF-16이 탄생했습니다. Microsoft는 이미 유니 코드를 사용하여 인코딩을 참조했으며 변경되지 않았습니다.

+2

** "Windows 용 메모리에 저장된 값은 항상 UTF-16 little-endian입니다."** 이것이 내가 필요한 것입니다! 고마워요! 그냥 어딘가에 문서화되어 있을까? – Narek

+0

@Narek, 여기에 대한 참조입니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/dd374081(v=vs.85).aspx. 인용구 : "일반적으로 Windows 응용 프로그램은 UTF-16을 내부적으로 사용해야하며 인터페이스를 통해 다른 형식을 사용해야하는"얇은 레이어 "의 일부로 만 변환합니다." 리틀 엔디안이라는 사실은 Windows에서 규정하지 않고 리틀 엔디안 Intel 프로세서라는 점에서 분명합니다. –

+0

감사 마크, 정말 도움이되었습니다. – Narek