2012-06-25 3 views
1

파이썬 2.7.2의 문자열에는 "\ u0638"이 있습니다. 나는 그것을 파일에 쓸 때 : 내가 볼 stdout에 같은 문자열을 인쇄 할 때 FF FE 38 06 : 진수에서파이썬 UTF-16 인코딩 16 진수 표현

f = open("J:\\111.txt", "w+") 
f.write(u"\u0638".encode('utf-16')) 
f.close() 

그것은처럼 보이는 '\ XFF \ xfe8 \ X06'.

위의 쿼리 :stdout에 출력되는 문자열의 \ x38은 어디입니까? 다른 말로하면 stdout에 출력되는 문자열이 '\ xff \ xfe \ x38 \ x06'이 아닌 이유는 무엇입니까?

나는 두 번 파일에 문자열을 작성하는 경우 :

f = open("J:\\111.txt", "w+") 
f.write(u"\u0638".encode('utf-16')) 
f.write(u"\u0638".encode('utf-16')) 
f.close() 

파일의 진수 표현 바이트 순서 표시 (BOM)를 포함 \ XFF \ XFE 두 번 : FF FE 38 06 FF FE 38 06

BOM을 UTF-16으로 인코딩 된 문자열로 작성하지 않으려면 어떻게해야할까요?

답변

5

ASCII 문자 80x38입니다. 그래서 문자열 :

\xff\xfe8\x06 

바이트입니다. 공백으로 구분, 바이트는 다음과 같습니다

\xff \xfe 8 \x06 

파이썬은 인쇄 가능한 ASCII 문자를 나타내지 않는 바이트의 \x 표기법을 사용합니다.

+0

다른 방법으로 넣어 :

파이썬 2.X에서
fp = open(filename, 'w', encoding='utf-16') fp.write(u'write one line\n') fp.write(u'write another line\n') fp.close() 

, 코덱 래퍼를 사용하여 ''\ X38 '=='8 ' ' –

+0

원래 질문의 예제가 'u'\ u063a ''인 경우 대답은 훨씬 더 분명했을 것입니다. –

3

"utf-16le"또는 "utf-16be"(리틀 엔디안 또는 빅 엔디안)로 인코딩하면 BOM 작성이 생략됩니다. 물론 BOM이 없으면 디코더는 어느 엔디안이 기대 하는지를 알아야합니다.

+0

답변을 수락 한 것으로 표시 할 수 없습니다 :). 답변 해주셔서 감사합니다! – Romeno

1

\xff\xfe8\x06\x38! 8 == \x38.

두 번째 질문에 대해서는 BOM을 피하기 위해 (UTF-16BE 또는 UTF-16LE 코덱을 사용하는) 엔디안을 명시하면 BOM이 인쇄되지 않습니다.

그러나 할 일은 인코딩과 디코딩을 처리하는 파일 래퍼를 사용하고 프로그램에서 유니 코드를 사용하는 것입니다. 파이썬 3.0에서 open 내장 함수는이 작업을 수행 할 수 있습니다

fp = codecs.open(filename, 'w', 'utf-16') 
fp.write(u'write one line\n') 
fp.write(u'write another line\n') 
fp.close()