【问题标题】:Private Unicode Character displays differently in Python 3 Interpreter私有 Unicode 字符在 Python 3 解释器中的显示方式不同
【发布时间】:2017-05-17 18:15:54
【问题描述】:

所以我在 Windows 10 上使用 Private Character Editor 私下创建了一个 unicode 字符。该字符使用代码 E000 保存。我从 Character Map 复制它并粘贴到文本编辑器中,它可以工作。但是,当我将它粘贴到 Python IDLE 编辑器中时,它甚至会在运行程序之前更改为不同的 unicode 字符。我不能使用 u'unicode_string' 或类似的东西,因为我的 unicode 字符甚至在解释器中都不起作用。我是编程新手。

我的问题是,如何在 Python 3.4 中使用我的私有 unicode 字符?

This 是我在记事本上看到的。

This 是我在 Python 3.4 解释器上看到的。

【问题讨论】:

  • 您可能在 IDLE Python 编辑器中没有正确的字体,或者该字符使用的字体与您预期的字体不同。
  • @nneonneo 根据我的字符映射,我正在使用一种名为 All Fonts (Private Characters) 的字体。如何更改 IDLE Python 编辑器字体?
  • 你可以尝试从命令行 Python 解释器打印你的角色,而不是使用 IDLE 吗?
  • Aside:这也是我不使用也不推荐 IDLE 的另一个原因。
  • CPython 对 Windows 控制台的使用在 3.6 中得到了极大的改进,可以更好地处理非 ascii 字符。如果想在控制台上打印通用 unicode 字符,请获取 3.6。 IDLE 的字符显示通过 tk. Tk 仅限于 Basic Multilingual Plane(计划在 2017 年更改),但在 3.6 之前,tk 和 IDLE 显示的 unicode 比 Windows 的控制台好得多。

标签: python windows unicode python-3.4 python-idle


【解决方案1】:

Python 并不是真正有趣的部分,而 shell 或终端才是。在我们的例子中,Windows 使用特殊的代码点来表示私有字符编码。要获得这些,您需要在 Windows 的 shell 上获取字符的十六进制转储,然后您可以在 Python 中渲染该字符。

注意:使用Unicode点E021更高的,因为较低的数字代码点通常用于控制,似乎python解释器的Windows shell并且 IDLE 使用不允许您使用私有字符覆盖那些。

演示

我通过生成我自己的私人角色来测试您的问题。我将把我的测试图像放在这里,因为它不会在 Stack Overflow 上的文本中正确呈现。

说明

我使用 Windows 10 中的 Character Map 程序复制符号并将其粘贴到我的 python 环境中。环境可能会在右侧截断它,因为它是一个宽字符并且环境似乎不喜欢那样。 (我移动了光标以使其呈现全角。)

然后我继续通过使用默认的 utf-8 编码对字符进行编码来获取代码点的 hexdump,结果是 \xee\x80\xa1 作为 bytes 对象。

接下来我将数据打印为字符串以向您展示一个常见错误,以及如果您尝试打印这些字节的字符串会打印什么。

然后,我打印了b'\xee\x80\xa1',这就是您在软件中实际使用该符号的方式。

【讨论】:

  • 我的 私有 unicode 字符 (PUC) 适用于 notepad 等文本编辑器,也适用于 cmd。除了不能在 Python 解释器中工作外,它也不能在 Python 编辑器中工作。例如,如果我将我的 PUC 从 cmdnotepad 复制并粘贴到 Python 编辑器中,则会出现一个新的 unicode 字符,而不是我想要使用的 PUC。
  • @Arbiter,我做了一个测试,测试的最后一行是我如何在python中使用字符。您应该能够按照相同的步骤获取特殊字符的代码点。
  • 那行得通,但你说你是从 Windows 10 的字符图中复制并粘贴了你的字符?我试过了,但是当我将字符映射中的字符粘贴到编辑器中(以便我可以将其分配给 char 并对其进行编码)时,字符看起来完全不同。然后我尝试了你的其余代码,它工作但对于这个新角色,而不是我最初创建的那个。为什么当我从字符映射中粘贴 PUC 时,Python 会自动将我的 PUC 替换为随机的 unicode 字符?
  • @Arbiter 我更新了我的答案以更清楚,我实际上使用了 IDLE,因为那是你使用的。在 Character Map 中确保单击选择并复制,然后将其粘贴到终端中应该可以工作。此外,如果您在打开 shell 后更改或添加了字符,则该特定终端可能无法呈现该字符。关闭并重新打开 IDLE 可能会解决此问题。
  • 对于低范围的 PUA 字符,您会得到不同的符号,因为您已经有一种字体可以为它们定义字形以用于其自身目的,并且不同字体之间的后备在应用程序中差异很大。 (屏幕截图中出现的字体是 Gabriola。)这总是一个问题;如果您需要它是可靠的,特别是如果您需要它为其他人工作,私人使用字符不是您的答案。
【解决方案2】:

您可以在 Python 源代码中使用 \u 转义序列,如下所示:

my_unicode_string = 'This is my Unicode character: \ue000'
print(my_unicode_string)

【讨论】:

  • 这可以打印一个 unicode 字符,但它不能打印我创建的 unicode 字符。相反,它会打印一个随机的 Unicode 字符。我会在我的问题中附上一些截图
  • @Arbiter:这是一个不同的问题,值得单独提出一个问题。如果您的输出控制台无法显示字符,您必须设置输出控制台以使用正确的字体。这与这个问题无关。
  • @llnspectable 不仅如此,在我运行程序之前,Python 编辑器会用另一个随机 unicode 字符替换我的字符
  • 查看我附加的图片以获得澄清。您可以在notepad 上看到我的私有 unicode 字符出现,但在 Python(编辑器和输出控制台)中显示完全不同的 unicode 字符。当我从notepad 粘贴我的 PUC 时,这个新角色会立即出现,而它不应该出现,它应该与我最初复制的角色完全相同。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 2019-08-11
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多