http://home.paran.com/johnsonj/hangul/How%20to%20Use%20UTF-8%20with%20Python.html 에서 답을 찾을 수 있다.

바이트 순서 표식자(Byte Order Marker (BOM))

UTF-8 파일은 가끔 바이트 순서 표식(BOM)으로 시작하여 UTF-8로 인코딩 되어 있음을 알린다. 이는 보통 윈도우즈에서 사용된다. Mac OS X에서, (예, TextEdit 같은) 어플리케이션은 BOM을 무시하고 파일이 다시 저장될 때 그 표식을 제거한다. W3C HTML 평가기는 구형 어플리케이션에서 BOM을 처리하지 못할 수도 있다고 경고한다. 유니코드는 효과적으로 그 표식을 무시하므로, 파일을 읽을 때 문제가 되지 않을 것이다. 파일의 시작에 이 표식을 추가해 ASCII로 인코딩되었는지 UTF-8로 인코딩되었는지 결정하고 싶다면, codecs 모듈은 이렇게 하기 위한 상수를 제공한다:

out = file( "someFile", "w" )
out.write( codecs.BOM_UTF8 )
out.write( unicodeString.encode( "utf-8" ) )
out.close()

BOM과 UTF-8을 사용할 때 주의할 필요가 있다. 솔직히, 나는 이것이 파이썬의 버그라고 생각하지만, 나도 잘 모른다. 파이썬은 BOM 값을 무시하는 대신에 유니코드 문자로 바꾼다. 예를 들어 (파이썬 2.3에서 테스트함):

>>> codecs.BOM_UTF16.decode( "utf16" )
u''
>>> codecs.BOM_UTF8.decode( "utf8" )
u'\ufeff'

UTF-16에 대하여, 파이썬은 BOM을 빈 문자열로 디코드하지만, UTF-8에 대해서는, 문자 하나로 디코드한다. 왜 차이가 있는가? UTF-8 디코더는 UTF-16 디코더와 똑 같은 일을 해야 당연하고 BOM 표식을 제거해야 할 것이다. 그렇지만, 그렇게 하지 않기 때문에, 다음과 같이 손수 탐지하여 제거할 필요가 있을 것이다:

import codecs
if s.beginswith( codecs.BOM_UTF8 ):
	# 바이트 문자열이 BOM과 함께 시작한다: 무언가를 한다.
	# 예를 들어, 문자열을 UTF-8로 디코드한다
	
if u[0] == unicode( codecs.BOM_UTF8, "utf8" ):
	# 유니코드 문자열이 BOM으로 시작한다: 무언가를 한다.
	# 예를 들어, 그 문자를 제거한다.

# BOM이 존재한다면, 유니코드 문자열의 선두로부터 걷어낸다. 
u.lstrip( unicode( codecs.BOM_UTF8, "utf8" ) )
Posted by trigger
,