2014-12-12 1 views
1

파이썬 3.x는 일부 로케일 (예 : tr_TR.utf8)에 대한 대문자와 소문자 문제를 해결했지만 Python 2.x 분기에는이 기능이 없습니다. https://github.com/emre/unicode_tr/과 같은이 사용에 대한 몇 가지 해결 방법이 있지만 이런 종류의 해결책이 마음에 들지 않았습니다.Python 8 비트 ASCII 문자열을 16 비트 유니 코드로 변환하는 방법

그래서 저는 string.maketrans 메서드를 사용하여 원숭이 패치 유니 코드 클래스에 대해 새로운 upper/lower/capitalize/title 메서드를 구현하고 있습니다.

maketrans의 문제점은 두 줄의 길이가 같아야한다는 것입니다. 가장 가까운 해결책은 "어떻게 1 바이트 문자를 2 바이트로 변환 할 수 있습니까?"입니다.


참고 : I가 u'İ' (1 바이트 길이 \의 u0130)를 통과 할 때translate 방법 translate 인수로, 아스키 인코딩을 작동 하는가는 아스키 인코딩 오류 준다.

from string import maketrans 

import unicodedata 
c1 = unicodedata.normalize('NFKD',u'i').encode('utf-8') 
c2 = unicodedata.normalize('NFKD',u'İ').encode('utf-8') 
c1,len(c1) 
('\xc4\xb1', 2) 

# c2,len(c2) 
# ('I', 1) 
'istanbul'.translate(maketrans(c1,c2)) 
ValueError: maketrans arguments must have same length 
+0

'string.maketrans()'경우에도, 바이트 지향, 그래서 당신이 일하는 것이 무엇을 원하는 생각하지 않는다 8 비트 ASCII 문자를 16 비트 유니 코드로 변환하는 방법을 찾을 수 있습니다. – martineau

+0

당신은 8 비트 ASCII에서 16 비트 유니 코드로의 변환을 말하고 싶습니다. – guneysus

+0

@guneysus : 파이썬에서 제목의 질문에 대한 답은'unicode_text = ascii_bytestring.decode ('ascii')'입니다. "16 비트 유니 코드"는 매우 가난한 용어입니다. UCS-2 ("좁은"CPython 2 빌드의 유니 코드 문자열) 또는 UTF-16 인코딩을 사용하여 인코딩 된 텍스트 또는 BMP의 유니 코드 코드 포인트 또는 "16 비트 "무시하고 파이썬 유니 코드 문자열을 가정해야합니다 (내가했던 것처럼)? – jfs

답변

3

유니 코드 개체는 maketrans을 통해 매핑 된 2 바이트 문자열 대신 사전을 통해 다중 문자 변환을 허용합니다.

#!python2 
#coding:utf8 
D = {ord(u'i'):u'İ'} 
print u'istanbul'.translate(D) 

는 출력 :

#!python2 
#coding:utf8 
D = {ord(u'i'):u'İ'} 
s = 'istanbul'.decode('ascii') 
t = s.translate(D) 
s = t.encode('utf8') 
print repr(s) 

출력 :

İstanbul 

당신이 ASCII 바이트 문자열로 시작하고 UTF-8의 결과를 원하는 경우, 단순히 번역 주위 인코딩/디코딩 :

'\xc4\xb0stanbul' 

다음 chnique는 maketrans의 직무를 수행 할 수 있습니다. 사전 키는 유니 코드 서수 여야하지만 값은 유니 코드 서수, 유니 코드 문자열 또는 None 일 수 있습니다. None 인 경우 번역시 문자가 삭제됩니다.

#!python2 
#coding:utf8 
def maketrans(a,b): 
    return dict(zip(map(ord,a),b)) 
D = maketrans(u'àáâãäå',u'ÀÁÂÃÄÅ') 
print u'àbácâdãeäfåg'.translate(D) 

출력 :

ÀbÁcÂdÃeÄfÅg 

참조 : str.translate

+0

당신의 솔루션으로 제 문제가 해결되었습니다. – guneysus

관련 문제