Windows 7이 UTF-8이 아닌 유니 코드로 작동하는 이유는 무엇입니까?
술어
유니 코드 와 UTF-8 은 같은 종류가 아닙니다. 유니 코드는 문자 집합 (레퍼토리)을 정의하고 각 문자에 숫자 (코드 포인트)를 할당하는 문자 집합입니다. UTF-8은 디스크 또는 전송시 유니 코드 문자 스트림 을 나타내는 데 사용할 수있는 여러 인코딩 중 하나입니다 . 예를 들어, 동일한 유니 코드 문자 스트림을 UTF-16, UTF‑32 또는 UTF-7로 인코딩 할 수도 있습니다.
그러나, 메모장 제안은 다음을 포함한 옵션 "인코딩" ANSI
, Unicode
, Unicode big-endian
와 UTF-8
. 이것을 작성한 Microsoft 개발자가 잘못된 용어를 사용했습니다. "유니 코드"라고 할 때는 " UTF-16
little-endian "을 의미합니다. "ANSI"라고 말하면 코드 페이지 1252 (CP-1252)를 의미합니다.
Microsoft 메모장
Microsoft의 메모장은 바이트 순서 표시 ( BOM )와 함께 UTF-16을 쓰고 텍스트 파일을 읽을 때 메모장이 BOM을 찾습니다. BOM은 앱에 파일이 UTF-16임을 알리고 빅 엔디안인지 리틀 엔디안인지를 나타냅니다.
메모장이 BOM을 찾지 못하면 라이브러리 함수를 호출 IsTextUnicode
하여 데이터를보고 어떤 인코딩이 사용되었는지 추측하려고합니다. 때로는 (필연적으로) 잘못 추측합니다. 때로는 "ANSI"파일이 "Unicode"인 것으로 추측합니다. UTF-16 또는 UTF-8 파일을 코드 페이지 1252로 해석하려고하면 잘못된 글리프가 표시되고 일부 8 비트 값을 렌더링 할 글리프를 찾을 수 없습니다. 그러면 사각형으로 표시됩니다.
harrymc가 그의 답변 에서 언급 했듯이 메모장에 대한 더 나은 대안이 있습니다. 그러나 메모장을 사용하면 파일을 열 때 메모장을 추측하지 않고 인코딩을 명시 적으로 선택할 수 있습니다.
바이트 주문 마크
유니 코드 컨소시엄에 따르면 바이트 순서 표시 (BOM)는 선택 사항입니다. 그러나 Windows는 BOM을 사용하여 일부 인코딩을 구분합니다.
간단히 말해, 어떤 이유로 파일에 BOM이 부족했을 수 있습니다. 업그레이드 프로세스 중에 BOM이 언젠가 손실 되었습니까?
정사각형으로 표시되는 원본 파일이 여전히 있으면 16 진 덤프를 만들어 BOM이 포함되어 있는지 확인할 수 있습니다.
일반 텍스트 파일 표준
문제는 효과가 없다는 것입니다 아무도 일반 텍스트 파일에 대한 더 보편적 인 기준 -. 대신에 우리는 많은 부적합과 알 수없는 것들을 가지고 있습니다.
줄 끝은 어떻게 표시 되었습니까? 일부 플랫폼은 제어 문자 캐리지 리턴 (CR) 뒤에 줄 바꿈 (LF)을 사용하고 일부는 CR 만 사용하고 일부는 LF 만 사용합니다.
위의 터미네이터 또는 세퍼레이터입니까? 이것은 파일의 끝에 영향을 미치며 문제를 일으키는 것으로 알려져 있습니다.
탭 및 기타 제어 문자 처리 줄의 시작 부분에서 8 개의 표준 문자 너비의 배수에 맞추기 위해 탭을 사용한다고 가정 할 수 있지만 실제로는 이에 대한 확신이 없습니다. 많은 프로그램에서 탭 위치를 변경할 수 있습니다.
문자 세트 및 인코딩? 파일의 텍스트에 사용 된 것을 나타내는 표준은 없습니다. 가장 가까운 것은 인코딩이 유니 코드에 사용 된 것 중 하나임을 나타내는 BOM이 있는지 확인하는 것입니다. BOM 값에서 파일을 읽는 프로그램은 UTF-8과 UTF-16 등과 UTF-16의 Little-Endian 및 Big-Endian 변형 등을 구별 할 수 있습니다. 파일을 표시하기위한 보편적 인 표준은 없습니다. CP-1252 또는 KOI-8과 같은 다른 인기있는 인코딩으로 인코딩됩니다.
등등. 위의 메타 데이터는 텍스트 파일에 기록되지 않으므로 최종 사용자는 파일을 읽을 때 프로그램에 알려야합니다. 최종 사용자는 특정 파일의 메타 데이터 값을 알고 있거나 해당 프로그램이 잘못된 메타 데이터 값을 사용할 위험을 감수해야합니다.
부시 대통령은 사실을 숨겼다
Windows XP에서 이것을 시도하십시오.
- 메모장을 엽니 다.
- 글꼴을 Arial Unicode MS로 설정하십시오. (먼저 설치해야합니다. 메뉴에 표시되지 않으면 "글꼴 더보기"를 클릭하십시오.)
- "Bush hid facts"텍스트를 입력하십시오.
- 를 선택하십시오
Save As
. 로부터 Encoding
메뉴를 선택합니다 ANSI
.
- 메모장을 닫습니다.
- 문서를 다시여십시오 (예 :
Start
, My Recent Documents
).
- "Bush hid facts"대신에 see이 표시됩니다.
이것은 IsTextUnicode
메모장에서 사용 하는 함수가 ANSI (실제로 코드 페이지 1252) 텍스트가 BOM이없는 유니 코드 UTF-16LE임을 잘못 추측 함을 나타냅니다. 로 저장된 파일에는 BOM이 없습니다 ANSI
.
윈도우 7
Windows 7에서 Microsoft IsTextUnicode
는 위의 상황이 발생하지 않도록 조정했습니다 . BOM이 없으면 이제 유니 코드 (UTF-16LE)보다 ANSI (CP 1252)를 추측 할 가능성이 높습니다. Windows-7 을 사용하면 리버스 문제가 발생할 가능성이 더 높습니다. 코드 포인트가 255보다 크지 만 BOM이없는 유니 코드 문자가 포함 된 파일은 이제 ANSI로 추측되어 잘못 표시 될 가능성이 높습니다.
인코딩 문제 방지
현재 가장 좋은 방법은 모든 곳에서 UTF-8을 사용하는 것 같습니다. 이상적으로 모든 오래된 텍스트 파일을 UTF-8로 다시 인코딩하고 텍스트 파일 만 UTF-8로 저장합니다. recode 및 iconv 와 같은 도구 가 있습니다.