Unicode字符串我有字符串:荏苒一起在Python
a = "ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ" b = "àáâãäèéçêëìíîïòóôõöùúûüÿ"
,我想建立一個字符串
"ÀàÁáÂâ..."
即一分爲二的字符串,然後將拉鍊半在一起。
我試過了天真zip(a, b)
但這沒有奏效。我認爲這是由於unicode的問題。
有誰知道我怎麼能得到我想要的結果?
Unicode字符串我有字符串:荏苒一起在Python
a = "ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ" b = "àáâãäèéçêëìíîïòóôõöùúûüÿ"
,我想建立一個字符串
"ÀàÁáÂâ..."
即一分爲二的字符串,然後將拉鍊半在一起。
我試過了天真zip(a, b)
但這沒有奏效。我認爲這是由於unicode的問題。
有誰知道我怎麼能得到我想要的結果?
在Python 2.x中,默認情況下字符串不是unicode。當處理unicode數據時,你必須做到以下幾點:與u
字符
前綴字符串文字:a = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ'
,或
,如果你想避免u
前綴,如果模塊你與正在足夠兼容,使用from __future__ import unicode_literals
進口使默認解釋爲Unicode字符串
如果您直接在您的Python代碼中編寫unicode字符串文字,將您的.py文件保存爲utf-8
格式,以便正確解釋文字。 Python 2.3+將解釋utf-8 BOM;一個很好的做法也是add a specific comment line在文件的開頭,表示編碼像# -*- coding: utf-8 -*-
,或
,你也可以保留保存.py文件中ascii
,但你需要逃避在中的Unicode字符文字,這可以少讀:'ÀÁÂÃ'
應該成爲'\xc0\xc1\xc2\xc3'
一旦你滿足這些條件,剩下的就是關於這些Unicode字符串應用算法,你將與海峽版本相同的方式工作。這裏是你的問題可能的解決方案與__future__
進口:
from __future__ import unicode_literals
from itertools import chain
a = "ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ"
b = "àáâãäèéçêëìíîïòóôõöùúûüÿ"
print ''.join(chain(*zip(a,b)))
>>> ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú
更多參考:
也許不美麗,但工作之一。
>>> a_longer = len(a) > len(b)
>>> new_string = ""
>>> for i in range((min(len(a), len(b)))):
... new_string += a[i] + b[i]
...
>>> if a_longer:
... new_string += a[i:]
... else:
... new_string += b[i:]
...
>>> print new_string
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúúûüÿ
或者,用拉鍊:
>>> a = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ'
>>> b = u'àáâãäèéçêëìíîïòóôõöùúûüÿ'
>>> c = zip(a, b)
>>> new_string = "".join([a + b for a, b in c])
>>> print new_string
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú
但是要注意,一個拉鍊方法不會給你的「B」字符串的其餘部分,因爲它不具有「一一對'串。
itertools.izip_longest將解決這個列表是不同的尺寸 –
你必須加入他們,你壓縮後的他們,也需要將其定義爲Unicode字符串:
>>>import itertools
>>>a = u"ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ"
>>>b = u"àáâãäèéçêëìíîïòóôõöùúûüÿ"
>>>zipped = itertools.izip_longest(a,b, fillvalue="")
>>>print "".join(["".join(x) for x in zipped])
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúûüÿ
>>>zipped = itertools.izip_longest(a,b, fillvalue="")
>>>print "".join(map("".join, zipped))
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúûüÿ
我覺得我沒有將它們定義爲一個新手的錯誤unicode字符串和itertools.izip_longest將解決名單是不同的大小:) –
@BenPage,你是正確的,改爲使用izip_longest。在位置0 – Josiah
這是工作在我身邊(的Python 2.x的):
>>> a = unicode('ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ', 'utf-8')
>>> b = unicode('àáâãäèéçêëìíîïòóôõöùúûüÿ', 'utf-8')
>>> print ''.join([ ''.join(c) for c in zip(a, b)])
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú
你有什麼錯誤?
當我試圖使用encode函數(我是不添加「UTF-8」 PARAM,我得到'「ASCII」編解碼器不能解碼字節0xc3:順序不在範圍內(128)' 但如果我將字符串定義爲「...」,那麼它就起作用:) –
你得到什麼錯誤? –
我以爲有人問哪個Python版本:Python 2.7版 –
@Nick,當我試圖壓縮,然後加入串輸出爲 'ÀÁÂÃÈÉÊ Ë Ì Í Î Ï Ù ' –