我在Django tutorial米比赛中偶然发现了这段话:

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

现在,我很困惑,因为afaik Unicode不是任何特定的表示,那么Python中的"Unicode字符串"是什么呢?这是指UCS-2吗?谷歌搜索出了this "Python Unicode Tutorial"条,其中大胆地指出

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

这显然是错的,还是真的?我曾多次被字符集和编码问题弄糊涂,但在这里我很确定我正在阅读的文档是混乱的.当Python给我一个"Unicode字符串"时,有人知道它在做什么吗?

推荐答案

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版本,并且需要处理基本多语言平面之外的字符,那么您将会出错,但这种情况仍然非常少见,而且真正需要额外字符的用户应该编译更宽的版本.

是大错特错,还是错了?

是的,这是完全错误的.说句公道话,我认为辅导课已经很老了;如果不是Unicode 3.1(将字符引入基本多语言平面之外的版本),它可能早于宽Unicode字符串.

念力还有一个额外的来源,源于Windows习惯使用术语"unicode"来表示,具体地说,就是NT内部使用的utf-16LE编码.微软的人可能经常复制这个有点误导的习惯.

Django相关问答推荐

在Django的个人页面中的问题

为特定表行更新或创建

如何删除django请求中的重复项

Django - 站点匹配查询不存在

Django:在模板中呈现表单字段时添加 CSS 类

多租户 Django 应用程序:根据请求更改数据库连接?

相关字段查找无效:​​icontains

django 用一个提交按钮提交两种不同的表单

Django Facebook Connect 应用推荐

Django REST 异常

无法通过 pip 安装 Django 2.0

手动触发 Django 邮件错误报告

Django BigInteger自动增量字段作为主键?

Python/Django:从 values_list() 创建一个更简单的列表

Django:获取上次用户访问日期

Django:使用 ModelForm 编辑现有数据库条目

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

Django 不调用模型清理方法

暂时禁用 Django 缓存

AWS Cognito 作为网站的 Django 身份验证后端