2012-06-07 3 views
1

UTF-8로 인코딩 된 문자열을 string.ljust으로 왼쪽 정렬하려고합니다. 이 예외는 발생했습니다 : UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128). 예 :UTF-8로 인코딩 된 문자열을 파이썬으로 왼쪽 정렬하는 방법은 무엇입니까?

s = u"你好" // a Chinese string 
stdout.write(s.encode("UTF-8").ljust(20)) 

올바른 트랙에 있습니까? 아니면 다른 포맷으로 접근해야합니까?

감사합니다.

답변

5

정확한 코드와 정확한 오류를 게시 했습니까? 코드가 cp437utf-8 터미널 모두에 오류를 던지지 않고 작동하기 때문입니다. 어쨌든 유니 코드 문자열을 터미널에 보내기 전에이를 정당화해야합니다. 대신 길이 2의 인코딩 할 때 UTF-8 인코딩 중국어 길이 6을 가지고 있기 때문에 그 차이를 참고 :

>>> sys.stdout.write(s.encode('utf-8').ljust(20) + "hello") 
你好    hello 
>>> sys.stdout.write(s.ljust(20).encode('utf-8') + "hello") 
你好     hello 

참고 또한 한자 일반적인 고정 폭 글꼴의 다른 문자보다 더 넓은 일들이 아직되지 않을 수도 있습니다 당신이 원하는대로 혼합 언어 (솔루션을 this answer 참조) 경우 정렬 :

>>> sys.stdout.write("12".ljust(20) + "hello") 
12     hello 

는 일반적으로 당신은 stdout에 명시 적으로 인코딩을 건너 뛸 수 있습니다. 파이썬은 암시 적으로 터미널의 인코딩 터미널에 유니 코드 문자열을 인코딩 (sys.stdout.encoding 참조)

sys.stdout.write(s.ljust(20)) 

을 또 다른 옵션은 print을 사용하고 있습니다 :

print "%20s" % s # old-style 

나 :

print '{:20}'.format(s) # new-style 
관련 문제