簡體   English   中英

如何以原始語言打印unicode字符串的元組(不是u'foo'形式)

[英]How to print tuples of unicode strings in original language (not u'foo' form)

我有一個unicode對象元組列表:

>>> t = [('亀',), ('犬',)]

打印出來,我得到:

>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]

我想這是這些字符串的utf-8字節碼表示的列表?

但我想看到的是打印出來的,驚喜:

[('亀',), ('犬',)]

但是我在將字節碼重新變成人類可讀的形式方面遇到了過多的麻煩。

但我想看到的是打印出來的,驚喜:

[('亀',),('犬',)]

你想看到它打印出來的是什么? 因為如果它是控制台,它根本不能保證您的控制台可以顯示這些字符。 這就是為什么Python的'repr()'對象表示用於\\ -escapes的安全選項,你將始終能夠在屏幕上看到並輕松輸入。

作為先決條件,您應該使用Unicode字符串(u'')。 而且,正如Matthew所提到的,如果你想能夠直接在源代碼中編寫u'亀',你需要確保Python可以讀取文件的編碼。 對於偶爾使用非ASCII字符,最好堅持使用轉義版本u'\\ u4e80',但是當你想要閱讀很多東亞文本時,“#coding = utf-8”是絕對是要走的路。

print'[%s]'%','。join([','。join('(%s,)'%','。join(ti)for ti in t)])

這將打印用引號打開的字符。 你真的想要:

def reprunicode(u):
    return repr(u).decode('raw_unicode_escape')

print u'[%s]' % u', '.join([u'(%s,)' % reprunicode(ti[0]) for ti in t])

這可行,但如果控制台不支持Unicode(這在Windows上特別麻煩),你會得到一個很大的舊UnicodeError。

在任何情況下,這很少重要,因為您在這里看到的對象的repr()通常不會進入應用程序的公共用戶界面; 它只適用於編碼器。

但是,您會很高興知道Python 3.0的行為完全符合您的要求:

  • 沒有'u'前綴的普通字符串現在是Unicode字符串
  • repr()逐字顯示大多數Unicode字符
  • 更好地支持Windows控制台中的Unicode(如果您的環境不是UTF-8,您仍然可以在Unix上獲得UnicodeError)

Python 3.0有點新,而且庫不太受支持,但它可能更適合您的需求。

首先,你的帖子中存在輕微的誤解。 如果您定義這樣的列表:

>>> t = [('亀',), ('犬',)]

......那些不是你定義的unicode ,而是str 如果你想擁有unicode類型,你必須在角色之前添加一個u

>>> t = [(u'亀',), (u'犬',)]

但是我們假設你真的想要str ,而不是unicode 主要的問題是, __str__列表(或元組)的方法實際上等於其__repr__方法(它返回一個字符串,評價時,將精確地創建相同的對象)。 因為__repr__方法應該是獨立於編碼的,所以字符串盡可能以最安全的方式表示,即ASCII范圍之外的每個字符都表示為十六進制字符(例如, \\xe4 )。

不幸的是,據我所知,沒有用於打印區域設置感知的列表的庫方法。 您可以使用幾乎通用的功能,如下所示:

def collection_str(collection):
    if isinstance(collection, list):
        brackets = '[%s]'
        single_add = ''
    elif isinstance(collection, tuple):
        brackets = '(%s)'
        single_add =','
    else:
        return str(collection)
    items = ', '.join([collection_str(x) for x in collection])
    if len(collection) == 1:
        items += single_add
    return brackets % items

>>> print collection_str(t)
[('亀',), ('犬',)]

請注意,這不適用於所有可能的集合(例如,集合和字典),但很容易擴展它來處理這些集合。

Python源代碼文件是嚴格的ASCII,因此除非指定編碼,否則必須使用\\u\u003c/code>轉義序列。 PEP 0263

#!/usr/bin/python
# coding=utf-8
t = [u'亀', u'犬']
print t

當您將數組傳遞給print ,Python會使用Python的字符串轉換規則將對象轉換為字符串 這種轉換的輸出是為eval()設計的,這就是你看到那些\\u\u003c/code>序列的原因。 基於bobince的解決方案,這是一個解決問題的方法。 控制台必須接受Unicode,否則會引發異常。

t = [(u'亀',), (u'犬',)]
print repr(t).decode('raw_unicode_escape')

所以這似乎做我想要的:

print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])


>>> t = [('亀',), ('犬',)]
>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]
>>> print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])
[(亀,), (犬,)]

當然有更好的方法來做到這一點。

(但到目前為止的其他兩個答案不會導致原始字符串按需要打印出來)。

人們似乎想念人們想要的東西。 當我從一個元組打印unicode時,我只想擺脫'u''[''('和引號。我們想要的是一個類似下面的函數。在搜索網后,它似乎是最干凈的方式原子可顯示數據。如果數據不在元組或列表中,我認為這個問題不存在。

def Plain(self, U_String) :
          P_String = str(U_String)
          m=re.search("^\(\u?\'(.*)\'\,\)$", P_String)
          if (m) :  #Typical unicode
             P_String = m.group(1).decode("utf8")
          return P_String  

嘗試:

import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM