Bush hid the facts

(“부시가 사실을 숨겼다”)는 윈도우, 특히 윈도우 2000 이후에 포함된 메모장의 오류를 흔히 부르는 이름이다. 이 오류는 다음과 같은 방법으로 재현할 수 있다.

 메모장에 라고 치고 ANSI 인코딩으로 저장한다.
 메모장을 닫고, 그 파일을 다시 열어 본다.
  대신 알아 볼 수 없는 한자들(이 경우 )로 바뀌어 있을 것이다. (올바른 언어팩이 설치되어 있지 않은 경우 사각형 모양의 도형이 대신 나타난다.)

혹자는 이 오류를 음모론으로 보기도 했지만,  말고도 다양한 문자열(예를 들어 )이 이 오류를 일으키기 때문에 설득력이 떨어진다. KBS에서 방영하는 스펀지에서는 방송에서 이 오류를 다루면서, 위 과정에서 나타나는 한자가 ‘사실은 자기가 숨겨도 언젠가는 밝혀진다’라는 의미라고 해석하기도 하였다.

오류의 원인 
이 오류는 메모장이 내부적으로 사용하는 윈도우 API 함수 IsTextUnicode가 짧은 문자열에 대해 잘못된 문자 인코딩을 반환해서 생기는 문제이다. 예를 들어서 는 사실 ANSI 인코딩으로 표현된 원래 문자열을 엔디언 형식으로 저장된 UTF-16 문자열로 해석해서 나온 문자열이다.

구체적으로 ‘Xxxx xxx xxx xxxxx’ 형식으로 쓰인 여러 영어 문자열이 이 버그에 영향을 받을 수 있다. (하지만 와 같이 이 버그에 영향을 받지 않는 문자열도 있다.) 이 문자열들은 UTF-16으로 해석했을 때 보통 U+6100부터 U+7AFF에 이르는 영역의 문자로 해석되며, 이 문자들은 모두 한자에 속하기 때문에 알아 볼 수 없는 한자로 보이는 것이다.

레이먼드 첸은 이 문제에 대해 자신의 블로그에서 바이트 순서 표식(BOM)이 없는 경우 UTF-16을 자동으로 선택하지 말 것을 제안했다.

자세히 
메모장이 파일을 ANSI 인코딩으로 제대로 인식하지 못하고 UTF-16 리틀 엔디언으로 인식해서 열었기 때문이다. 이제 Bush hid the facts 글자 각각의 ANSI 값을 알아보자.

 공백: 0x20
 B: 0x42
 a: 0x61
 c: 0x63
 d: 0x64
 e: 0x65
 f: 0x66
 h: 0x68
 i: 0x69
 s: 0x73
 t: 0x74
 u: 0x75
ANSI 인코딩에선 이 글자들이
 42 75 73 68 20 68 69 64 20 74 68 65 20 66 61 63 74 73
으로 저장된다. 그러나 이 글자들은 UTF-16 리틀 엔디언으로
 75 42 68 73 68 20 64 69 74 20 65 68 66 20 63 61 73 74
로 바뀐다. 이는
 75-42 68-73 68-20 64-69 74-20 65-68 66-20 63-61 73-74
로 두 글자 단위로 묶이며, 결과로
 U+7542 U+6873 U+6820 U+6469 U+7420 U+6568 U+6620 U+6361 U+7374를 출력하게 한다. 따라서 출력 결과는 이다. (대문자 B(0x42) 대신 소문자 b(0x62)로 했다면, U+7542  대신 U+7562 가 출력된다.)

참고사항 
 대신 나타난 문자열()을 해석해 보면 다음과 같다.

참조

외부 링크 
  Hoax Slayer의 설명 

소프트웨어 버그
문자 인코딩
영어 어구