Python UTF-8字符范围
问题描述:
我使用一个用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'是无效字符。
混淆。
答
看起来你用\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
Python2或Python3? – Sarcoma
难道是这个https://docs.python.org/2/library/functions.html#ord“如果给出了一个unicode参数,并且Python是用UCS2 Unicode编译的,那么这个字符的代码点必须在[ 0..65535];否则字符串长度为2,并且会引发TypeError。“因为1D463 = 119907 – Sarcoma
@Sarcoma,所以,如果我明白它的意思,值范围应该是0000到FFFF或TypeError被抛出?在我的情况下,我得到的值大于FFFF,而不是TypeError异常 – No1Lives4Ever