2017-02-06 60 views
1

我想使用Python字符串的encode方法返回的Unicode轉義碼字,就像這樣:如何獲得Python''.encode('unicode_escape')返回ascii的轉義碼?

>>> print('ф'.encode('unicode_escape').decode('utf8')) 
\u0444 

這正常工作與非ASCII字符,但ASCII字符,它只是返回ascii字符本身:

>>> print('f'.encode('unicode_escape').decode('utf8')) 
f 

期望的輸出將是\u0066。此腳本用於教學目的。

如何獲得所有字符的unicode十六進制代碼?

+0

還有什麼你能指望' 'F'' 回去呢? –

+0

你不能。 'unicode_escape'永遠不會打印可打印的ASCII字符。你想在這裏做什麼?換句話說,什麼是*實際目標*? –

+0

@MartijnPieters請參閱上面的編輯。該腳本用於教學目的,並且'f'的輸出將是'\ u0066'。 – reynoldsnlp

回答

2

您的要求有點奇怪。在Python中,通常我們只是使用ord來代替。這裏不需要編碼/解碼。

>>> '"\\U{:08x}"'.format(ord('f')) # ...or \u{:04x} if you prefer 
'"\\U00000066"' 
>>> eval(_) 
'f' 
+0

謝謝!十六進制格式的'ord'和'x'規範的組合似乎完美。 – reynoldsnlp

1

你必須手動這樣做;如果你認爲你的所有輸入都在Unicode BMP中,那麼直接的正則表達式可能是最快的;這種替換每個字符與他們\uhhhh逃生:

import re 

def unicode_escaped(s, _pattern=re.compile(r'[\x00-\uffff]')): 
    return _pattern.sub(lambda m: '\\u{:04x}'.format(
     ord(m.group(0))), s) 

我明確限制了圖案的BMP優雅地處理非BMP點。

演示:

>>> print(unicode_escaped('foo bar ф')) 
\u0066\u006f\u006f\u0020\u0062\u0061\u0072\u0020\u0444