2010-01-13 2 views
4

저는 파이썬 초보자이고 utf-8 문제가 있습니다.파이썬에서 utf-8 특수 문자를 검색하고 바꾸는 방법은 무엇입니까?

필자는 utf-8 문자열을 가지고 있으며 모든 독일어 움라우트를 ASCII 대체 문자로 대체하고자합니다 (독일어에서는 u-움라우트 'ü'가 'ue'로 다시 쓰일 수 있습니다).

U-움라우트는 유니 코드 코드 포인트 (252)를 가지고, 그래서 나는이 시도 :

>>> str = unichr(252) + 'ber' 
>>> print repr(str) 
u'\xfcber' 
>>> print repr(str).replace(unichr(252), 'ue') 
u'\xfcber' 

내가 마지막 문자열 u'ueber' 될 것으로 예상.

은 내가 궁극적으로하고 싶은 것은 'UE'가있는 파일의 모든 U-움라우트를 대체 할 수 있습니다 : 당신의 도움에 대한

import sys 
import codecs  
f = codecs.open(sys.argv[1],encoding='utf-8') 
for line in f: 
    print repr(line).replace(unichr(252), 'ue') 

감사합니다! (저는 파이썬 2.3을 사용하고 있습니다.)

+2

참고. 따라서 U는 또한 유니 코드 시퀀스로 나타낼 수 있습니다. U + 0075 U + 0308 – elmuerte

답변

8

repr(str)str의 인용 된 버전을 반환합니다. 프린트 된 결과는 문자열을 다시 얻기 위해 파이썬으로 다시 입력 할 수 있습니다. 따라서 über이 포함 된 문자열 대신 문자 그대로 \xfcber이 포함 된 문자열입니다.

üue으로 바꾸려면 str.replace(unichr(252), 'ue')을 사용해도됩니다. 당신은 내가 당신이 그것을 필요로한다고 생각하지 않습니다하지만, 당신이 repr에 전체 표현식을 포장 수, 그 결과의 인용 버전을해야하는 경우

:

repr(str.replace(unichr(252), 'ue')) 
7

을 나는 그것이 가장 쉬운 생각 unichr (252)보다 더 나은 유니 코드 표현을 직접적으로 사용하여보다 명확한 방법으로 명확하게 해줍니다.

>>> s = u'über' 
>>> s.replace(u'ü', 'ue') 
u'ueber' 

이 문자열의 '파이썬 표현을'인쇄됩니다로에 repr를 사용할 필요가 없습니다, 당신은 단지 읽을 수있는 형식의 캐릭터 라인을 제시 할 필요가있다.

당신은

#-*- coding: UTF-8 -*- 

추가 된 파일의 인코딩을 말하고, 존재하지 않는의 경우에는 평 파일의 beggining에서 다음 줄을 포함하는 것이 필요합니다 물론을, 선언 된 코딩은 파일의 인코딩과 동일해야합니다. 일부 문제가 될 수 있는지 확인하십시오 (예 : Windows 용 Eclipse에서 문제가 발생했습니다. 예를 들어 cp1252라는 파일을 기본적으로 씁니다.) 또한 UTF-8 또는 라틴어 인 시스템의 인코딩과 동일해야합니다. -1 또는 다른 사람. 그것이 파이썬 라이브러리의 일부로서 또한


는, 변수의 정의로 str를 사용하지 마십시오. 당신이 나중에 문제가있을 수 있습니다.

(나는에 노력하고 있습니다 파이썬 2.6, 나는 파이썬 2.3에서 결과가 동일하다고 생각한다)

+0

중요한 점은 실제로 소스 파일을 코딩 선언에 선언 된 인코딩으로 저장합니다. 많은 사람들이 그것을 잊어 버립니다. –

+0

실제로 이것을 UTF-8로 편집 할 수 있어야합니다. 예를 들어 전체 시스템이 Latin-1로 설정된 경우 파일의 인코딩 선언이 무엇이든 상관없이 작동하지 않습니다. UTF-8 사용을 보장 할 수 없다면 unichr을 사용하는 원래 방법이 더 좋다는 것을 의미합니다. –

+0

의견으로 인해 몇 가지 정보를 추가했습니다. @mark : 좋은 점, 나는 그 이유 때문에 Eclipse에 몇 가지 문제가있었습니다. @jae 최선의 방법은 일관된 인코딩을 선언 한 다음 문자를 u'ü로 선언하는 것입니다. 유니 코드 번호로 선언하면 코드에서 매우 혼란 스럽습니다. 나는 그것이 이상한 상황에서 필연적 일 수 있다는 것에 동의하지만, 내 경험상, 보통 적절한 인코딩을 사용하기 쉽다. – Khelben

5

모든 소스 파일 인코딩과 그 문제를 피할 수있다. 당신이하고있는 일이 무엇인지, 그 코드는 어디서든 읽고 수정할 수 있습니다.

유일한 악센트 부호가 붙은 라틴 문자가 소문자 - u -와 - 움라우트 - 일명 분음 기호 인 곳은 모르겠다. 그래서 전제 조건에 따라 번역 표를 반복하는 코드를 추가했습니다. 너는 그것을 필요로 할 것이다.

# coding: ascii 

translations = (
    (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'), 
    (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'), 
    # et cetera 
    ) 

test = u'M\N{LATIN SMALL LETTER O WITH DIAERESIS}ller von M\N{LATIN SMALL LETTER U WITH DIAERESIS}nchen' 

out = test 
for from_str, to_str in translations: 
    out = out.replace(from_str, to_str) 
print out 

출력 : 유니 코드 표준은 또한 빗질 문자를 정의하는

Moeller von Muenchen 
관련 문제