2011-07-05 3 views
0

간단한 파일 파서와 작성기를 썼지 만, 유니 코드의 중요성에 대해 이야기 한 기사를 보았습니다. 그런 다음 입력 파일이 ASCII 코드로되어 있다고 가정합니다. , 그것은 항상 상황이 아닐 수도 있지만, 내 상황에서는 거의 발생하지 않을 것입니다.파이썬에서 UTF-8 친화적 인 파서 작성하기

드문 경우이지만 UTF-8 인코딩 파일이 필요합니다.

단순히 읽기 및 쓰기 방식을 변경하여 UTF-8 파일로 작업 할 수있는 방법이 있습니까? 내가 문자열로하는 것은 그것들을 저장 한 다음 쓰는 것뿐입니다. 그래서 나는 그것들을 읽고, 저장하고, 올바르게 쓸 수 있는지 확인해야합니다.

또한 ascii 및 UTF-8 파일을 별도로 처리해야하며 각기 다른 기능을 작성해야합니까? 나는 아직 ASCII 파일 이외의 다른 것을 사용하지 않았으며 유니 코드 처리에 대해서만 읽었다.

+2

ASCII는 UTF-8의 하위 집합이므로 두 세트의 코드가 필요하지 않습니다. –

답변

3

기본적으로 파이썬은 유니 코드를 지원합니다. 첫 번째 파일에서 두 번째 파일로 직접 읽고 쓰는 경우 바이트는 그대로 복사되므로 데이터가 손실되지 않습니다. 그러나 문자열을 디코딩 한 다음 다시 인코딩하는 경우 올바른 인코딩을 사용해야합니다.

3

파이썬 2를 사용하는 경우 모든 str 개체를 unicode 개체로 간단히 변경할 수 있습니다. 유니 코드 객체는 문자열과 동일한 메소드를 모두 가지고 있지만 ASCII 대신 유니 코드 형식으로 인코딩됩니다. http://docs.python.org/library/functions.html#unicode을 참조하십시오.

파이썬 3을 사용하는 경우 문자열은 기본적으로 UTF-8로 인코딩됩니다.

+3

'unicode' 객체는 유니 코드 문자의 시퀀스입니다. UTF-8 또는 다른 인코딩으로 인코딩되지 않았습니다. – geoffspear

+0

@Wooble : 기술적으로, Py_UNICODE가 사용하는 인코딩이 무엇이든 인코딩되어 있습니다.이 인코딩은 구현에 따라 UCS-2 또는 UCS-4가 될 수 있습니다. – JAB

+0

좋아, 정확성을 위해 내 게시물을 수정하겠습니다. 그러나 이것은 대답의 맥락에서 비교적 작은 세부 사항입니다. –

2

파이썬 2.6 이상을 사용하는 경우 io 라이브러리와 그 io.open 메서드를 사용하여 원하는 파일을 열 수 있습니다. 귀하의 경우 인수가 'utf-8'으로 설정되어야합니다. 반환 된 파일 객체를 읽거나 쓰면 문자열이 자동으로 인코딩/해독됩니다.

어쨌든 UTF-8이 ASCII의 상위 집합이기 때문에 ASCII에 특별한 것을 할 필요가 없습니다.

0

파일을 읽고 쓰고 다른 유형의 인코딩 된 입력을 예상하지 않는 한 특별한 작업을 수행하지 않아도됩니다.

% cat /tmp/u 
π is 3.14. 

% file /tmp/u 
/tmp/u: UTF-8 Unicode text 

% cat f.py 
f = open('/tmp/u', 'r') 
d = f.read() 
print d.split() 
f.close() 

% python f.py 
['\xcf\x80', 'is', '3.14.'] 

표준 입력을 UTF-8을 사용하여 선언하거나 수락하면이 내용이 변경됩니다.

% cat g.py 
s = 'π is 3.14.' 
print s.split() 

% python g.py 
    File "g.py", line 1 
SyntaxError: Non-ASCII character '\xcf' in file g.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

가 올바르게이 처리 (상기 SyntaxError 예외로 참조) PEP 263 당 초기에 파이썬 프로그램의 인코딩을 선언.

% cat h.py 
# -*- coding: utf-8 -*- 
s = 'π is 3.14.' 
print s.split() 

% python h.py 
['\xcf\x80', 'is', '3.14.']