python 2和3中的UTF-8字符串

2024-03-27

以下代码适用于 Python 3:

people = [u'Nicholas Gyeney', u'Andr\xe9']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))

并产生以下输出:

Nicholas Gyeney, André  
Writers: Nicholas Gyeney, André

但在 Python 2.7 中,我收到以下错误:

Traceback (most recent call last):
  File "python", line 4, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' 
in position 21: ordinal not in range(128)

我可以通过更改来修复此错误", ".join(people) to ", ".join(people).encode('utf-8'),但如果我这样做,Python 3 中的输出将更改为:

b'Nicholas Gyeney, Andr\xc3\xa9'  
Writers: b'Nicholas Gyeney, Andr\xc3\xa9'

所以我尝试使用以下代码:

if sys.version_info < (3, 0):
    reload(sys)
    sys.setdefaultencoding('utf-8')

people = [u'Nicholas Gyeney', u'Andr\xe9']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))

这使得我的代码可以在所有版本的 Python 中运行。但我读到了使用setdefaultencoding 灰心丧气 https://stackoverflow.com/q/3828723/69537.

处理这个问题的最佳方法是什么?


首先我们假设您想要支持 Python 2.7 和 3.5 版本(2.6 和 3.0 到 3.2 的处理方式略有不同)。

正如您已经阅读过的,setdefaultencoding不鼓励,并且在您的情况下实际上不需要。

要编写处理 unicode 文本的跨平台代码,通常只需要在几个地方指定字符串编码:

  1. 在脚本顶部,shebang 下方# -*- coding: utf-8 -*-(仅当您的代码中有带有 unicode 文本的字符串文字时)
  2. 当您读取输入数据时(例如从文本文件或数据库)
  3. 当您输出数据时(再次从文本文件或数据库)
  4. 当您在代码中定义字符串文字时

以下是我如何通过遵循这些规则来更改您的示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

people = ['Nicholas Gyeney', 'André']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))

print(type(writers))
print(len(writers))

其输出:

<type 'str'>
23

以下是发生的变化:

  • 文件顶部指定的文件编码
  • 已更换\xe9与实际的 Unicode 字符 (é)
  • Removed u前缀

它在 Python 2.7.12 和 3.5.2 中运行得很好。

但请注意,删除u前缀将使 python 使用常规str键入而不是unicode(参见输出print(type(writers)))。的情况下utf-8它在大多数地方都像 unicode 字符串一样工作,但是在检查文本长度时将返回错误的值。在这个例子中len回报23,其中实际字符数是22。这是因为底层类型是str,它将每个字节计为一个字符,但是字符é实际上应该是两个字节。

换句话说,这在输出数据正常时有效(如您的示例中所示),但如果您想对文本进行字符串操作则无效。在这种情况下,您仍然需要使用u在字符串操作之前,将数据显式添加前缀或转换为 unicode 类型。

所以,如果不是你的简单例子,最好还是使用u字首。您在两个地方需要它:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

people = [u'Nicholas Gyeney', u'André']
writers = ", ".join(people)
print(writers)
print(u"Writers: {}".format(writers))

print(type(writers))
print(len(writers))

其输出:

<type 'unicode'>
22

Note: u前缀在 Python 3.0 中被删除,然后在 Python 3.3 中再次重新引入以实现向后兼容性。

有关在 Python 2 中使用 unicode 文本的所有复杂性的详细说明,请参阅官方文档:Python 2 - Unicode 指南 https://docs.python.org/2/howto/unicode.html.

以下是指定文件编码的特殊注释的摘录:

Python 支持以任何编码方式编写 Unicode 文字,但是您有 声明正在使用的编码。这是通过包含一个来完成的 特殊注释作为源文件的第一行或第二行:

#!/usr/bin/env python
# -*- coding: latin-1 -*-

u = u'abcdé' print ord(u[-1])

该语法的灵感来自于 Emacs 指定变量的表示法 本地到文件。 Emacs 支持许多不同的变量,但是 Python 只支持coding. The -*-符号向 Emacs 表明 评论很特别;它们对于 Python 来说没有任何意义,但是 习俗。 Python 寻找coding: name or coding=name在里面 评论。

如果您不包含这样的注释,则使用的默认编码将是 ASCII。

如果你拿到这本书”学习Python,第五版 http://shop.oreilly.com/product/0636920028154.do”,我鼓励您阅读第八部分高级主题中的第 37 章“Unicode 和字节字符串”。它包含在两代 Python 中使用 Unicode 文本的详细说明。

另一个值得一提的细节是format总是返回一个asciistring 如果格式字符串是ascii,无论参数是在unicode.

与此相反,旧式格式%返回一个unicode如果任何参数是字符串unicode。所以不要写这个

print(u"Writers: {}".format(writers))

你可以这样写,它不仅更短、更漂亮,而且在 Python 2 和 3 中都可以工作:

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

python 2和3中的UTF-8字符串 的相关文章

  • C# 中将一个字符串拆分为另一个字符串

    我一直在使用Split 分割字符串的方法 但这似乎仅在您按字符分割字符串时才有效 有没有办法分割一个string 另一个字符串是按参数分割的 我尝试将拆分器转换为字符数组 但没有成功 换句话说 我想分割string THExxQUICKxx
  • Python 字典 - 在 2 个字符的字符串中查找第二个字符,该字符产生最小值

    我想提交密钥的第一部分并返回该密钥的剩余部分 以最小化值 并从第一部分开始 例如 d ab 100 ac 200 ad 500 如果我要进去 a I would like to return b min d s s for s in d i
  • Pandas Pivot_Table :非数字值的行计算百分比

    这是我在数据框 df 中的数据 Document Name Time SPS2315511 A 1 HOUR SPS2315512 B 1 2 HOUR SPS2315513 C 2 3 HOUR SPS2315514 C 1 HOUR S
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 向 Python 2.6 添加 SSL 支持

    我尝试使用sslPython 2 6 中的模块 但我被告知它不可用 安装OpenSSL后 我重新编译2 6 但问题仍然存在 有什么建议么 您安装了 OpenSSL 开发库吗 我必须安装openssl devel例如 在 CentOS 上 在
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 如何使用 msgpack 进行读写?

    如何序列化 反序列化字典data with msgpack http msgpack org The Python 文档 http msgpack python readthedocs io en latest badge latest似乎
  • 提交表格并上传带有请求的文件

    我正在努力提交特定的表格蟒蛇请求 http www python requests org 我想使用它的网站上的其他表单工作正常 我可以提交登录表单等 这只是我遇到问题的文件上传 显然 提交表单效果很好 因为我从网站收到一条消息 说 请返回
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • x11 - 导入错误:没有名为“kivy.core.window.window_x11”的模块

    目前我正在尝试构建一个我通过 buildozer 用 Python 和 Kivy 编写的应用程序 无论我在做什么 我都会遇到 window x11 的问题 即使我在代码中注释掉所有与 Windows 相关的内容或执行本文中描述的所有操作 这
  • 在tensorflow .ckpt文件中使用预训练模型

    我有一个 ckpt 文件 我只想得到 cnn 的权重 我已经从 ckpt 检查点文件中进行了训练 inception resnet v2 2016 08 30 import tensorflow as tf saver tf train S
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • psutil:测量特定进程的CPU使用率

    我正在尝试测量进程树的 cpu 使用率 目前获取进程 没有子进程 的 cpu usage 就可以了 但我得到了奇怪的结果 import psutil p psutil Process PID p cpu percent 还给我float g
  • 使 matplotlib 图形默认看起来像 R?

    Is there a way to make matplotlib behave identically to R or almost like R in terms of plotting defaults For example R t
  • Python - 如何将列表保存为图像?

    我生成一个常规列表 是否可以将此列表保存为 JPEG 图像或 PNG 或其他格式 以便我可以打开图像并查看它 我目前正在尝试使用 python 成像库 PIL 来解决这个问题 这是可能的解决方案之一 使用以下方法创建一个空图像对象 Imag
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • python中匹配3个或更多相同的字符

    我正在尝试使用正则表达式在字符串中查找三个或更多相同的字符 例如 你好 不匹配 噢 会的 我尝试过做类似的事情 re compile 1 3 a zA Z re compile w 1 5 但似乎都不起作用 w 1 2 是您正在寻找的正则表
  • Shap - 颜色条不显示在摘要图中

    显示summary plot时 不显示颜色条 shap summary plot shap values X train 我尝试过改变plot size 当绘图较高时 会出现颜色条 但它非常小 看起来不应该 shap summary plo

随机推荐

  • C# - 使用 Linq 选择 XML 后代

    我有以下 XML 结构
  • 如何将异步操作与 .NET 4 中的任务并行库链接起来?

    我正在尝试以编程方式链接 C 4 中的异步操作 例如写入给定的 Stream 对象 我最初是 手动 完成此操作 将回调从一个操作挂钩到下一个操作 但我想我应该尝试使用 NET 4 任务并行库来省去重新发明并发轮的麻烦 首先 我将异步调用包装
  • 使用正则表达式分割不同长度的字符串

    我不知道使用正则表达式是否可以实现这一点 我只是问一下是否有人知道答案 我有一个string hellohowareyou 我需要像这样分割它 h el loh owar eyou 分割完成后 第一个字符串的长度为 1 第二个字符串的长度为
  • ios6 uilabel 文本未居中对齐

    我正在开发一个最低版本为 ios 5 的 ios 应用程序 我刚刚遇到了 uilabels 的一个奇怪问题 或者也许我错过了一些明显的东西 不管怎样 我遇到的问题是我有一个 uilabel 它的文本要居中对齐 在 ios 5 上一切正常 但
  • 使用 Cloudformation 的 AWS Api Gateway 代理资源?

    我正在尝试从 API 网关端点代理配置为网站的 S3 存储桶 我使用控制台成功配置了端点 但无法使用 Cloudformation 重新创建配置 经过大量的试验 错误和猜测 我想出了以下 CF 堆栈模板 它让我非常接近 Resources
  • PHP / PDO:SQl 查找包含字符串值的行[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我尝试发出请求来查找包含特定字符串值的行 这是我的代码的摘录 Getting motscles value motscles PO
  • 替换 DataFrame 索引中的 NaN

    我有一个数据框 如下所示 one two a 2 5 b 3 6 NaN 0 0 如何用字符串替换索引中的 NaN 例如 无标签 I tried df df replace np NaN No label and df index df i
  • 从嵌套 javascript 对象中删除属性的最佳方法是什么?

    我有一个树对象 如下所示 我尝试删除 items 数组属性 如果它为空 我不确定执行此操作的最佳方法是什么 我正在考虑循环遍历密钥 检查属性 然后删除使用delete myJSONObject prop 欢迎任何想法 想法吗 text Tr
  • 使用.Net MVC,如何列出播放不同文件的多个html音频播放器?

    我和我的朋友正在使用 Net 开发一个大学项目 我们正在尝试建立一个网站 允许用户以类似于 Soundcloud 等网站的方式收听音频剪辑 目前 我们有一个基本的 MVC 站点 允许用户将音频上传到服务器文件系统 并在数据库表中记录有关该文
  • 通过 bash 过滤 json - 不区分大小写

    我有 json 代码 需要通过属性的值对其进行过滤DNSName 过滤器必须不区分大小写 我怎样才能做到这一点 有没有可能解决它jq 这就是我创建 json 代码的方式 aws elbv2 describe load balancers r
  • 当生成的存在类型过于复杂时,无形状 HList 上的 toList 会失败

    给出以下定义 class R T class A class B class C 这有效 val s1 new R A new R B HNil val r1 s1 toList r1 of type List R gt A with B
  • Flutter firebase 未初始化

    我收到这个错误 未处理的异常 PlatformException null error 主机平台为非空返回值返回空值 null null 我已经更新了 yaml 中的所有 firebase 包 但仍然有此错误 E flutter 11230
  • Angular2 单选按钮在生产中不起作用

    我最近使用 Visual Studio 2015 和 MVC 构建了一个 angular2 应用程序 该项目还托管 WEBAPI 和 Angular 代码 我使用此处显示的说明将 MS Build 与 Angular build 集成htt
  • 无法解析在 iPhone 中获取数据的 Web 服务

    我是电话编程新手 使用下面的代码我得到网络服务的响应 NSString soapMessage NSString stringWithFormat n
  • 可定制的夏令时规则

    任务是什么 根据项目规范 我需要计算特定时区偏移的 DST 规则 规则cannot通过标准仪器应用 例如date default timezone set 因为我们不能依赖软件配置 并且如果某些 DST 规则发生更改 也无法更新它 我拥有的
  • Java:LinkedBlockingQueue是否考虑消费者的顺序?

    我有 3 个线程 2 个消费者 ConsumerA and ConsumerB and a Producer 我也有一个LinkedBlockingQueue queue At t 1 ConsumerA调用queue take At t
  • 我如何从 JMapViewer 世界地图中获取鼠标单击位置

    我正在使用地图浏览器 http wiki openstreetmap org wiki JMapViewerjar 在 JPanel 上显示世界地图 在地图上我添加MapMarkerDot s这是 GPS 点 问题是当我单击MapMarke
  • ASP.NET Web App 和 C# 应用程序之间的双向通信

    我需要构建一个可以双向通信的网站和应用程序 我将使用 ASP NET 构建网站 并使用 C 构建应用程序 我将自己托管该网站 它将与应用程序在同一台计算机上运行 我不知道在两者之间发送数据的最佳技术是什么 C 应用程序需要一直运行 我应该构
  • firebase多位置更新用户身份验证和数据库

    我有一个用于注册新用户的表格 其中包含电子邮件 密码 全名和电话号码 我可以用firebase auth createUserWithEmailAndPassword如果成功则创建新用户 然后我用firebase database ref
  • python 2和3中的UTF-8字符串

    以下代码适用于 Python 3 people u Nicholas Gyeney u Andr xe9 writers join people print writers print Writers format writers 并产生以