2016-03-11 75 views
1

我正在嘗試創建一個文件並刪除所有不是希臘語的字符。我們找到了字母表的Unicode值,880 - 1023,並且能夠用簡單的print(unichr(880))行打印出正確的字符。問題是,運行此代碼如何輸入unicode字符並獲取其數值

greek ='ÏÎ' 
for c in greek: 
    if(unichr(c) >= 880 and unichr(c) <= 1023): 
     print(c) 

時有沒有辦法輸入任何字母或符號,將返回一個Unicode值。我們已經與價值外,仍然測試的希臘範圍內得到了同樣的錯誤,UnicodeDecodeError: 'ascii' codec cannot decode byte 0xc3 in position 0: ordinal not in range(128)

+2

請注意正確格式化您的代碼。您應該使用行返回將代碼放在不同的行上。 –

+1

我想你想'ord' –

+0

這是python 2? – tdelaney

回答

1

你有幾個問題。假設這是python 2(因爲python 3中沒有unichr,你會得到一個不同的錯誤),你的第一個問題是你沒有初始化一個unicode字符串。

>>> greek ='ÏÎ' 
>>> len(greek) 
4 

這些都不是2個Unicode字符...他們是4個單字節字符也恰好是Unicode字符的UTF-8編碼。相反,做

greek =u'ÏÎ' 

接下來,這些都不是機器人,我的意思是希臘字母,你認爲他們是。

>>> ord(greek[0]) 
207 

這些是128-255範圍內的代碼頁字符,並且在您要查找的範圍之外。你想要這些嗎?

>>> greek = u'Ϊΐ' 
>>> ord(greek[0]) 
938 

最後,unichr去錯誤的方式......它轉換序字符,但你想要去的其他方式。所以,

>>> for c in greek: 
...  if ord(c) >= 880 and ord(c) <= 1023: 
...   print(c) 
... 
Ϊ 
ΐ 
+0

有沒有一個網站/鏈接給你正確的符號/字母和與它們相關的代碼。如果我們從文件中讀取這個文件,我們是否也做同樣的事情?我們的最終目標是讀取一個大文件,我們首先得到幾個字符的邏輯和測試 –

+0

奇怪的轉換可能發生在幾個地方,所以它有可能讓您有合適的數字開始。它的unicode 100種方式之一讓我瘋狂。我使用了[unicode測試頁面](http://www.ltg.ed.ac.uk/~richard/unicode-sample.html)(你需要刪除空格),但是使用'u''join(unichr(x)對於範圍內的x(880,1024))'會起作用。 – tdelaney

+1

順便說一句,如果可以的話,我建議在Python 3中實現。它的默認字符串類型是unicode,並且有更少的意外。有時候它更容易混淆,因爲你可能玩弄字節,編碼等等,但是總的來說錯誤更少。 – tdelaney

1

你一定要使用ord,它是像chrunichr反函數:

>>> x = unichr(1000) 
>>> ord(x) 
1000 
>>> y = unichr(880) 
>>> y 
u'\u0370' 
>>> ord(y) 
880 
>>> help(ord) 
Help on built-in function ord in module __builtin__: 

ord(...) 
    ord(c) -> integer 

    Return the integer ordinal of a one-character string. 

所以你把它傳給一個unicode字符,它會給你這個字符的序數。

2

unichr接受整數並且返回 unicode字符。我的第一個建議是,您在這裏替換unichrord,因爲您傳遞的是字符串,並且想要取回表示unicode代碼點的整數。

現在對於Unicode解碼errror-我懷疑這是因爲print隱式地試圖編碼您的unicode字符串,但不知道如何去做。如果你用utf-8顯式編碼你的unicode字符串,你可能會有更多的運氣。試試這個:

greek = u'ÏÎ' 
for c in greek: 
    if(ord(c) >= 880 and ord(c) <= 1023): 
     print(c.encode('utf-8')) 
0

您必須確保您的編輯器以UTF-8編碼保存您的程序。這取決於你使用的文本編輯器。如果您使用IDLE,則會在保存時建議添加coding行。

另外,不需要在括號內附上條件,您可以使用short。

這是蟒蛇3

# -*- coding: utf-8 -*- 
greek ='ÏÎ' 
for c in greek: 
    if 880 <= ord(c) <= 1023: 
    print(c) 

(在我的屏幕,這兩個字符顯示爲資本我波浪口音和資金我抑揚音 - 用正確的字符替換)。

相關問題