2017-04-23 129 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