2015-01-16 3 views
0

파이썬 유니 코드 문자열에 문제가 있습니다. 유니 코드 문자열을 인쇄 할 때 파이썬은 유니 코드 전용 문자를 올바르게 표시하지만이 문자열이 목록 안에 있으면 Python은이 동일한 문자를 이상한 코드로 변환합니다.파이썬 유니 코드 목록 이상한

다음은 예제 코드입니다 :

# -*- coding: utf-8 -*- 
s = 'São Paulo' 
print s 
>>São Paulo 

OK!

# -*- coding: utf-8 -*- 
l = ['São Paulo'] 
print l 
>>['S\xc3\xa3o Paulo'] 

Not OK ... 올바른 형식의 유니 코드 문자열을 표시하지 않습니다. 당신이 그것에 대해 생각을 중지하면, 코너의 경우 모호성을 피하기 위해 정말 불가피 - 컨테이너 (print이 암시 적으로 사용하는 것입니다)에

+1

당신은'repr()'디버그 출력을 가지고 있습니다. 모든 파이썬 컨테이너는 그 내용을 보여주기 위해 컨테이너를 사용합니다. 이것은 * 정상적인 동작입니다. 레코드에는 UTF-8로 인코딩 된 데이터를 포함하는 * 바이트 문자열 *이 있습니다. 유니 코드 문자열을 얻으려면 * 디코드 *하거나'u '..'접두사를 사용해야합니다. 그래도'unicode' 객체를리스트에 가지고 있다면 디버깅 출력을 얻을 수 있습니다. –

+0

이 동작은 기본 문자열 인코딩이 유니 코드로 변경된 Python 3에서 변경되었습니다. –

답변

1

__str__ 항상 항목__repr__을 보여줍니다.

컨테이너 나 아이템 클래스를 사용하는 대신 자신 만의 프린트와 같은 기능을 정의하는 것이 좋습니다. 이것은 필연적으로 잠재적 모호성을 일으킬 것이지만 아마도 그것으로 살 수 있습니다.

예 :

def showstr(s): 
    if "'" in s: 
     delim = '"' 
    else: 
     delim = "'" 
    return delim + s + delim 

def showlist(l): 
    result = [] 
    for x in l: 
     result.append(showstr(x)) 
    return '[' + ', '.join(result) + ']' 

이 몇 가지 잠재적 모호성을 가지고 있지만 직접보다는 showlist(l) 인쇄 (및 취급하지 않는 문자열과 다른 종류의 항목을 모두 포함하는 목록도 구분 기호의 두 가지를 포함하는 문자열) l은 찾고있는 것처럼 보이는 "귀엽고 예쁜"출력을 향한 출발이 될 수 있습니다.

+0

문제가 해결되었습니다. Alex Martelli, 특별히 고맙습니다! –

+0

@JohannGomes, 반갑습니다. 그러나 ** 도움이되는 답변 **을 기억하십시오. (답안의 왼쪽에있는 체크 표시 개요를 클릭하십시오). –

0

str은 무엇이든 인쇄되지만, str(<iterable>)은 컨테이너 요소에 repr을 호출합니다.