2017-04-23 43 views
3

我使用一個用utf-8編碼的文本文件,並用python讀取它的內容。閱讀內容後,我將文本分割爲字符數組。Python UTF-8字符範圍

import codecs 

with codecs.open(fullpath,'r',encoding='utf8') as f: 
    text = f.read() 
    # Split the 'text' to characters 

現在,我對每個字符進行迭代。首先,將其轉換爲十六進制表示並在其上運行一些代碼。

numerialValue = ord(char) 

我注意到在所有這些字符之間,有些字符超出了預期的範圍。

預期的最大值-FFFF。 實際字符值 - 1D463。

我把這段代碼翻譯成了python。原始源代碼來自C#,其值'\ u1D463'是無效字符。

enter image description here

混淆。

+0

Python2或Python3? – Sarcoma

+0

難道是這個https://docs.python.org/2/library/functions.html#ord「如果給出了一個unicode參數,並且Python是用UCS2 Unicode編譯的,那麼這個字符的代碼點必須在[ 0..65535];否則字符串長度爲2,並且會引發TypeError。「因爲1D463 = 119907 – Sarcoma

+0

@Sarcoma,所以,如果我明白它的意思,值範圍應該是0000到FFFF或TypeError被拋出?在我的情況下,我得到的值大於FFFF,而不是TypeError異常 – No1Lives4Ever

回答

1

看起來你用\u而不是\U逃脫了你的Unicode代碼點(U + 1D463)。前者需要四個十六進制數字,後者需要八個十六進制數字。根據微軟的Visual Studio:

The condition was ch == '\u1D463'

當我在使用Python解釋這個文字,它不抱怨,但它高興地逃脫了前四個十六進制數字和3頁正常打印時,在cmd中運行:

>>> print('\u1D463') 
ᵆ3 

你得到這個例外:Expected max value - FFFF. Actual character value - 1D463,因爲你使用的是不正確的Unicode轉義,使用\U0001D463而不是\u1D463\u中字符代碼點的最大值爲\uFFFF\U的最大值爲\UFFFFFFFF。請注意前導零\U0001D463\U需要正是 8個六角數字和\u需要正好四個六角位數:

>>> '\U1D463' 
    File "<stdin>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \UXXXXXXXX escape 

>>> '\uFF' 
    File "<stdin>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-3: truncated \uXXXX escape