【问题标题】:Python utf-8 character rangePython utf-8 字符范围
【发布时间】:2017-04-23 07:48:58
【问题描述】:

我使用一个用 utf-8 编码的文本文件,并用 python 读取它的内容。阅读内容后,我将文本拆分为字符数组。

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'是无效字符。

感到困惑。

【问题讨论】:

  • Python2 还是 Python3?
  • 可能是这个docs.python.org/2/library/functions.html#ord "如果给出了 unicode 参数并且 Python 是使用 UCS2 Unicode 构建的,那么字符的代码点必须在 [0..65535] 范围内;否则字符串长度为 2,会引发 TypeError。”如 1D463 = 119907
  • @Sarcoma,所以,如果我理解正确,值范围应该是 0000 到 FFFF 或 TypeError 被抛出?就我而言,我得到的值大于 FFFF 而不是 TypeError 异常
  • 我认为这只适用于使用 UCS2 Unicode 构建的 Python2。
  • 到底是什么让你感到困惑???我看不出你在问题中写的任何令人困惑的事情......(除了我对什么是什么让你感到困惑的困惑?)

标签: python python-3.x utf-8


【解决方案1】:

您似乎使用 \u 而不是 \U 转义了您的 Unicode 代码点 (U+1D463)。前者需要四个十六进制数字,后者需要八个十六进制数字。根据 Microsoft Visual Studio:

The condition was ch == '\u1D463'

当我在 Python Interpreter 中使用这个文字时,它不会抱怨,但它会愉快地转义前四个十六进制数字,并且在 cmd 中运行时正常打印 3:

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

您收到此异常:Expected max value - FFFF. Actual character value - 1D463,因为您使用了不正确的 unicode 转义,请使用 \U0001D463 而不是 \u1D463\u 中字符代码点的最大值为\uFFFF\U 的最大值为\UFFFFFFFF。注意\U0001D463 中的前导零,\U 采用 正好 八个十六进制数字,\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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2021-09-16
    • 1970-01-01
    • 2015-06-02
    • 2022-11-12
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多