2014-04-17 83 views
1

比方说,我在俄罗斯的变量内容:显示在python西里尔符号

msg = '<some russian text here>' 
print msg 

给了我正确的值,但

print [msg] 

给了我这样的:

['\xd0\x9f\xd0\xa4 "\xd0\x9a\xd0\xa2\xd0\x9f-\xd0\xa3\xd1\x80\xd0\xb0\xd0\xbb" (\xd0\x97\xd0\x90\xd0\x9e)'] 

如何将西里尔文符号保存在列表中?

+2

Python的容器使用'再版()'来表示包含的值;输出仅用于调试*仅*。你是否有*用''引号产生输出,而列表对象的方括号? –

+0

+1 for unicode repr –

+0

@qarma:但这不是一个unicode值。它是一个**字节的字符串**。 –

回答

1

你不能直接这样做,但你可以非常接近pprint

有例如代码在https://stackoverflow.com/a/10883893/705086

它仅覆盖的unicode类型,但是可以容易地适用于UTF-8编码的STR /字节如在OP。

理想情况下,pprint应该保持格式化/打印的PDO是一个有效的Python表达式的不变量。链接的代码也可以被破解以保持这种不变。

你可以猴子路径pprint模块保持这种不变的:

import functools, pprint 

def escape(s): 
    lead = "" 
    if isinstance(s, unicode): 
     s = s.encode("utf-8") 
     lead = "u" 
    return "%s\"%s\"" % (lead, s.replace("\\", "\\\\").replace("\"", "\\\"")) 

def patched(f): 
    if hasattr(f, "_already_patched"): 
     return f 

    @functools.wraps(f) 
    def sub(object, *args, **kwargs): 
     try: 
      if isinstance(object, basestring): 
       return escape(object), True, False 
     except Exception: 
      pass 
     return f(object, *args, **kwargs) 

    sub._already_patched = True 
    return sub 

pprint._safe_repr = patched(pprint._safe_repr) 

pprint.pprint([u"\N{EURO SIGN}", u"\N{EURO SIGN}".encode("utf-8")]) 
[u"€", "€"] 
相关问题