Windows 上的 Python str 与 unicode,Python 2.7,为什么 'á' 变成 '\xa0'

2024-02-21

背景

我使用的是 Windows 机器。我知道不再支持 Python 2.*,但我仍在学习 Python 2.7.16。我还有Python 3.7.1。我知道Python 3.*"unicode被重命名为str" https://stackoverflow.com/a/18034409/1175496

我使用 Git Bash 作为我的主 shell。

I read 这个问题 https://stackoverflow.com/questions/18034272/python-str-vs-unicode-types。我觉得我理解 Unicode(代码点)和编码(不同的编码系统;字节)之间的区别。

Question

  • 当我评价时'á',我期望得到'\xc3\xa1' 如这个答案所示 https://stackoverflow.com/a/49138962/1175496
  • 当我评价时len('á'),我期望得到2, 如这个答案所示 https://stackoverflow.com/a/18034409/1175496

但我没有得到预期的结果。 运行 git bash C:\Python27\python.exe 时...:

Python 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)] on win32

>>> 'á'
'\xa0'
#'\xc3\xa1' expected

>>> len('á') 
1
#2 expected

# one more for reference:
>>> 'à'
'\x85'
#'\xc3\xa0' expected

您能帮我理解为什么我会得到上面显示的输出吗?

具体为什么'á' become '\xa0'?

我尝试过的

我可以用unicode对象得到我期望的结果:

>>> u'á'.encode('utf-8')
'\xc3\xa1'
>>> len(u'á'.encode('utf-8'))
2

我可以打开IDLE我得到了不同的结果——不是expected结果,但至少我理解这些结果。

Python 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)] on win32
>>> 'á'
'\xe1'
>>> len('á')
1
>>> 'à'
'\xe0'

IDLE结果出乎意料,但我仍然理解结果;马丁·彼得斯解释 https://stackoverflow.com/questions/18034272/python-str-vs-unicode-types#comment26380927_18034277 why 'á' become '\xe1' 采用拉丁 1 编码.

那么,为什么 IDLE 会给出与直接运行 Git Bash Python 2.7.1 可执行文件不同的结果呢?换句话说,如果 IDLE 为使用拉丁语 1对我的输入进行编码,我的 Git Bash Python 2.7.1 使用什么编码。可执行,这样'á'变成'\xa0'

我想知道什么

是我的默认编码有问题吗?我太害怕了更改默认编码。 https://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console#comment36374776_2013263

>>> import sys; sys.getdefaultencoding()
'ascii'

我感觉这是我的终端的编码有问题吗? (我使用 git bash)我应该尝试吗改变PYTHONIOENCODING环境变量 https://stackoverflow.com/a/32176732/1175496?

我尝试检查一下git bashlocale https://stackoverflow.com/a/36692549/1175496,结果是:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

另外,我正在使用交互式 Python ,我应该尝试使用这个文件吗?

# -*- coding: utf-8 -*- sets the source file's encoding, not the output encoding.

I know 升级到Python 3是一个解决方案。 https://stackoverflow.com/a/4637795/1175496,但我仍然好奇为什么我的 Python 2.7.16 的行为有所不同。


感谢@dan04、@MarkTolonen 和@(请参阅对上述问题的评论)。正如@MarkTolonen 所说:

命令提示符使用默认的 OEM 代码页(美国 Windows 的 cp437 ....)”

通过检查这似乎很清楚代码页 437 https://en.wikipedia.org/wiki/Code_page_437对于我尝试编码的值:

>>> 'á' #-> '\xa0' expected in code page 437
>>> 'à' #-> '\x85' expected in code page 437

I highlight those values in the screenshot below. screenshot of code page 437 from https://en.wikipedia.org/wiki/Code_page_437 highlighting the characters à (mapping to byte \x85) and á (mapping to byte \xa0)

我使用了 @MarkTolonen 的跑步建议the chcp command https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/chcp获取或设置我的 shell/终端使用的编码。chcp是“的缩写”change code p年龄”。如果您使用Git Bash,使用chcp.com https://stackoverflow.com/a/36174752/1175496反而。果然,当我跑步时chcp,输出是Active code page: 437:

然后我尝试了 @juanpa.arrivilillaga 使用文件的建议。首先,我尝试了一个明确使用 437 代码页的文件。

  1. 我添加了“神奇评论” https://peps.python.org/pep-0263/指定编码 437:# -*- coding: cp437 -*-,但这还不足以对文件进行编码。神奇的评论向 Python 解释如何decode文件 https://stackoverflow.com/a/3170647/1175496.
  2. 我也不得不更改文件的编码 https://stackoverflow.com/questions/30082741/change-the-encoding-of-a-file-in-visual-studio-code(告诉我的编辑器 VS Code,如何encode在 CP437 中)。

一旦我用 Python 完成了这两件事file(用CP437编码和解码),我得到与我的操作相同的“意外”结果,这证实了 CP437 确实是我使用的编码终端/外壳.

一般来说,您必须both encode and包括“解码魔法注释”,以及确保您的 shell 使用相同的编码!

  • 如果我在CP437中包含没有编码的cp437“魔法注释”(VS Code默认编码是UTF-8),则长度'á'是 2;就像 UTF-8 一样! (请注意,结果打印在我的 CP437 shell 中,因此它们看起来很奇怪;我看到了字符,即\xc3在CP437!)
  • 如果我使用 CP437 进行编码但不包含魔术注释,则会收到错误消息:(SyntaxError: Non-ASCII character '\xa0' in file 437_encoding.py on line 4)

如果我使用 utf-8 进行编码,并且包含 utf-8 的“神奇注释”,然后将 shell 更改为使用 utf-8 (chcp.com 65001),然后我得到了我期望的结果!

最后,如果我尝试使用 @MarkTolonen 的建议sys.stdout.encoding,它会告诉我结果“cp437”!

  • 请注意sys.stdout.encoding(这对我来说具有价值cp437)...
  • is 不一样 as sys.getdefaultencoding()(这对我来说具有价值ascii...

如果我尝试检查sys.stdout.encoding当我使用chcp.com将代码页更改为 UTF-8(值 65001),出现错误LookupError: unknown encoding: cp65001这是这里有更详细的描述 https://stackoverflow.com/a/3259271/1175496

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 上的 Python str 与 unicode,Python 2.7,为什么 'á' 变成 '\xa0' 的相关文章

  • Sublime Text 插件开发中的全局 Python 包

    一 总结 我不知道 Sublime Text 插件开发人员如何使用 Sublime Text 查找全局 Python 包 而不是 Sublime Text 目录的 Python 包 Sublime Text使用自己的Python环境 而不是
  • 补丁 - 为什么相对补丁目标名称不起作用?

    我已经从模块导入了一个类 但是当我尝试修补类名而不使用模块作为前缀时 出现类型错误 TypeError Need a valid target to patch You supplied MyClass 例如 以下代码给出了上述错误 imp
  • 删除 Django 1.7 中的应用程序(和关联的数据库表)

    是否可以使用 Django 1 7 迁移来完全删除 卸载应用程序及其所有跟踪 主要是其所有数据库表 如果没有 在 Django 1 7 中执行此操作的适当方法是什么 python manage py migrate
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • Docker 警告:无法从守护进程获取默认注册表端点

    在 Windows 10 上 当我调用 docker 命令时 docker pull mongo windowsservercore 我得到以下输出 Warning failed to get default registry endpoi
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • Vagrant 错误:无法挂载 VirtualBox 共享文件夹(Guest Additions、vboxsf)

    问题 我在 Windows 10 上安装了 Vagrant 这样我就可以在虚拟机中创建个人本地开发环境 我读到的有关 Vagrant 的所有内容都表明我什至可以启动多个系统并通过 NAT 端口转发测试它们之间的通信 但首先 我只想在对其余部
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud

随机推荐