我在Django教程中偶然发现了这段话:

Django模型有一个默认的str ()方法,它调用unicode ()并将结果转换为UTF-8字节串。 这意味着unicode(p)将返回一个Unicode字符串,str(p)将返回一个普通字符串,其字符编码为UTF-8。

现在,我很困惑,因为afaik Unicode不是任何特定的表示,那么Python中的“Unicode字符串”是什么? 这是否意味着UCS-2? 谷歌搜索出现了这个“Python Unicode教程” ,大胆地说明了这一点

Unicode是一种双字节编码,涵盖了世界上所有常见的书写系统。

这是完全错误的,还是它? 我已经多次被字符集和编码问题搞糊涂了,但在这里我很确定我正在阅读的文档很混乱。 当有人给我一个“Unicode字符串”时,是否有人知道Python中发生了什么?

===============>>#1 票数:48 已采纳

什么是Python中的“Unicode字符串”? 这是否意味着UCS-2?

Python中的Unicode字符串内部存储为UCS-2(固定长度16位表示,几乎与UTF-16相同)或UCS-4 / UTF-32(固定长度32位表示)。 这是一个编译时选项; 在Windows上它始终是UTF-16,而许多Linux发行版为他们的Python版本设置了UTF-32('宽模式')。

您通常不应该关心:您将在字符串中看到Unicode代码点作为单个元素,并且您将不知道它们是否存储为两个或四个字节。 如果您使用的是UTF-16版本,并且需要处理Basic Multilingual Plane之外的字符,那么您将会做错,但这仍然非常罕见,真正需要额外字符的用户应该编译宽版本。

简单的错,或者是吗?

是的,这是非常错误的。 公平地说,我认为教程相当陈旧; 如果不是Unicode 3.1(引入基本多语言平面之外的字符的版本),它可能会预先列出宽的Unicode字符串。

Windows的习惯是使用术语“Unicode”来表示特别是NT内部使用的UTF-16LE编码,还有另外一个混淆源。 来自Microsoftland的人可能经常复制这种有些误导性的习惯。

===============>>#2 票数:8

同时,我做了一个精确的研究,以验证Python中的内部表示是什么,以及它的限制是什么。 Python中的Unicode真相 ”是一篇非常好的文章,直接引用Python开发人员的话。 显然,内部表示是UCS-2或UCS-4,具体取决于编译时开关。 所以乔恩,它不是UTF-16,但你的回答无论如何都让我走上正轨,谢谢。

===============>>#3 票数:0

Python将Unicode存储为UTF-16。 str()将返回UTF-16字符串的UTF-8表示。

===============>>#4 票数:-1

来自维基百科的UTF-8

UTF-8(8位UCS / Unicode转换格式)是Unicode的可变长度字符编码。 它能够表示Unicode标准中的任何字符 ,但UTF-8的字节代码和字符分配的初始编码向后兼容ASCII。 由于这些原因,它正逐渐成为电子邮件,网页[1]以及存储或流式传输字符的其他地方的首选编码。

因此,它取决于您希望在Unicode领域中表示哪个字符,在1到4个字节之间。

来自维基百科的Unicode:

在计算中,Unicode是一种行业标准,允许计算机一致地表示和操纵在世界上大多数书写系统中表达的文本。

因此,它能够代表世界上大多数(但不是全部)的书写系统。

我希望这有帮助 :)

===============>>#5 票数:-2

那么Python中的“Unicode字符串”是什么?

Python'知道'你的字符串是Unicode。 因此,如果你对它进行正则表达式,它将知道哪个是字符,哪个不是等,这真的很有帮助。 如果你做了一个strlen,它也会给出正确的结果。 举个例子,如果你对Hello进行字符串计数,你将得到5(即使它是Unicode)。 但是,如果你执行了一个外来单词的字符串计数,并且该字符串不是Unicode字符串,那么你将得到更大的结果。 Pythong使用Unicode字符数据库中的信息来识别Unicode字符串中的每个字符。 希望有所帮助。

  ask by Hanno Fietz translate from so

未解决问题?本站智能推荐:

3回复

在python中正则表达式和unicode utf-8?

我有代码块:( Django代码) 这允许我将标记名称放在Unicode字符中。 但我不知道为什么我的Unicode(高棉解码高棉符号范围:19E0-19FF Unicode标准,版本4.0)。我不能。 我的问题 : 如何更改上面的代码tagname_re = re.c
2回复

Django是否对Unicode(utf-8?)字符串进行双重编码?

我在Django中存储并输出一个ndash字符作为UTF-8时遇到了麻烦。 我从API获取数据。 在原始格式中,在文本编辑器中检索和查看时,给定的数据单元可能类似于: (\\ u2013–作为html实体)。 如果我直接从API获得并在Django中显示它,没问
1回复

django.contrib.auth utf-8 ascii python'在散列之前必须对Unicode对象进行编码'

我有一个最初在Linux机器(UTF-8)上创作的Django Web项目,并将git仓库代码克隆到了Windows机器上。 当访问从内置开发Web服务器运行的Django的管理界面时,我无法进行身份验证。 从Django shell运行了一些身份验证调用后,似乎出现了编码问题。 是的,我
6回复

如何过滤(或替换)UTF-8中超过3个字节的unicode字符?

我正在使用Python和Django,但我遇到了由MySQL限制引起的问题。 根据MySQL 5.1文档 ,他们的utf8实现不支持4字节字符。 MySQL 5.5将使用utf8mb4支持4字节字符; 而且,将来的某一天, utf8也可能会支持它。 但是我的服务器还没有准备好升级到M
2回复

以UTF-8编码的“Broken”unicode字符串?

我已经研究了unicode及其Python实现两天了,我想我已经看到了它的内容。 为了获得自信,我问我对当前问题的假设是否正确。 在Django中,表单给了我unicode字符串,我怀疑它是“破碎的”。 Python中的Unicode字符串应该用UTF-8编码,是吗? 在文本字段中输
1回复

Python / Django:如何将utf-16 str字节转换为unicode?

研究员, 我无法解析使用Django表单提交的unicode文本文件。 以下是我执行的快速步骤: 上传了一个文本文件(编码:utf-16)(文件内容: Hello World 13 ) 在服务器端,使用filename = request.FILES['file_fie
3回复

Scrapy XPath选择器文本的Unicode和UTF-8编码问题

我正在使用Scrapy和Python(作为Django项目的一部分)来抓取一个包含德语内容的网站。 我安装了libxml2作为Scrapy选择器的后端。 如果我通过选择器提取'Hüftsitz'这个词(这是它在网站上的显示方式),我得到: u'H\�\�ftsitz' (Scrapy X
1回复

python unicode#-*-编码:utf-8-*-没有完成工作…在哪里编码?我想我需要删除str并进行编码

您好,这是我想要做的; 我只是想在这里用非英语的单词“ with”的翻译来切换单词“ with”。 我无法在退货中使用其他非英语。 我不知道为什么...我有python文件,我使用的是django,并且在python文件的顶部放了# --编码:utf- 8-- 这是我的完整代码
2回复

Python UnicodeEncodeError,但我已将参数编码为UTF-8

这是我的代码: 异常消息是: 异常类型:UnicodeEncodeError 例外值:'ascii'编解码器无法编码位置138-141中的字符:序数不在范围内(128) dic参数值如下: params中的所有键值对都是Unicode对象。 为什么我仍然会
5回复

Python UTF-8转换问题

在我的数据库中,我存储了一些UTF-8字符。 例如“名称”字段中的“α” 通过Django ORM,当我读到这个时,我会得到类似的东西 我希望'α'。 经过一番挖掘,我想如果我做了 因此,当Python试图显示'\\ xce \\ xb1'时,我得到了alpha,但