- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我花了几个愤怒的时间寻找 Unicode 字符串的问题,这些字符串被分解为 Python (2.7) 对我隐藏的东西,但我仍然不明白。首先,我尝试在我的代码中始终使用 u".."
字符串,但这导致了臭名昭著的 UnicodeEncodeError
。我尝试使用 .encode('utf8')
,但这也无济于事。最后,事实证明我不应该使用任何一个,这一切都会自动解决。然而,我(在这里我需要感谢一位帮助过我的 friend )在用头撞墙时确实注意到了一些奇怪的事情。 sys.getdefaultencoding()
返回 ascii,而 sys.stdout.encoding
返回 UTF-8。 1. 在下面的代码中工作正常,无需对 sys
进行任何修改,并且 2. 引发 UnicodeEncodeError
。如果我使用 reload(sys).setdefaultencoding("utf8")
更改默认系统编码,则 2. 工作正常。我的问题是为什么这两个编码变量首先不同,我如何设法在这段简单的代码中使用错误的编码?请不要将我发送到 Unicode HOWTO ,我已经在关于 UnicodeEncodeError
的几十个问题中明显地读到了这一点。
# -*- coding: utf-8 -*-
import sys
class Token:
def __init__(self, string, final=False):
self.value = string
self.final = final
def __str__(self):
return self.value
def __repr__(self):
return self.value
print(sys.getdefaultencoding())
print(sys.stdout.encoding)
# 1.
myString = "I need 20 000€."
tok = Token(myString)
print(tok)
reload(sys).setdefaultencoding("utf8")
# 2.
myString = u"I need 20 000€."
tok = Token(myString)
print(tok)
最佳答案
My question is why the two encoding variables are different in the first place
它们有不同的用途。
sys.stdout.encoding
应该是您的终端用来解释文本的编码,否则您可能会在输出中得到 mojibake。在一个环境下可能是 utf-8,在另一个环境下可能是 cp437,等等。
sys.getdefaultencoding()
在 Python 2 上用于隐式转换(当编码未明确设置时),即 Python 2 可能将 ascii-only 字节串和 Unicode 字符串混合在一起,例如,xml.etree.ElementTree
将 ascii 范围内的文本存储为字节串或 json.dumps()
returns an ascii-only bytestring instead of Unicode in Python 2 — 可能是由于性能 — 字节在表示 ascii 字符方面比 Unicode 便宜。 Python 3 中禁止隐式转换。
sys.getdefaultencoding()
在 Python 2 中的所有系统上始终是 'ascii'
除非您覆盖它,否则您不应该这样做,否则它可能会隐藏错误和您的数据由于对数据使用可能错误的编码的隐式转换,可能很容易损坏。
顺便说一句,还有另一种常见的编码 sys.getfilesystemencoding()
可能与两者不同。 sys.getfilesystemencoding()
应该是用于对操作系统数据(文件名、命令行参数、环境变量)进行编码的编码。
使用# -*- coding: utf-8 -*-
声明的源代码编码可能与所有已经提到的编码不同。
当然,如果你从文件、网络读取数据;它可能使用与上述不同的字符编码,例如,如果在记事本中创建的文件使用 Windows ANSI 编码(例如 cp1252
)保存,则在另一个系统上,所有标准编码都可能与它不同。
重点是:由于与 Python 无关的原因,可能存在多种 编码,为了避免麻烦,请使用 Unicode 表示文本:尽快转换编码文本在输入上转换为 Unicode,并在输出时尽可能晚地将其编码为字节(可能使用不同的编码)——这就是所谓的 Unicode sandwich 的概念.
how do I manage to use the wrong encoding in this simple piece of code?
您的第一个代码示例不正确。您在 Python 2 的字节字符串中使用了您不应该做的非 ascii 文字字符。仅对二进制数据使用 bytestrings 的文字(或必要时所谓的 native 字符串)。如果您在任何不使用 utf-8 兼容编码的环境(例如 Windows 控制台)中使用 Python 2 运行它,该代码可能会产生诸如 I need 20 000Γé¼.
之类的 mojibake
假设 reload(sys)
不是其中的一部分,第二个代码示例就可以了。如果您不想在所有字符串文字前加上 u''
前缀;你可以使用 from __future__ import unicode_literals
您的实际问题是 UnicodeEncodeError
错误,reload(sys)
不是正确的解决方案!
正确的解决办法是configure your locale properly on POSIX (LANG
, LC_CTYPE
)或 set PYTHONIOENCODING
envvar if the output is redirected to a pipe/file or install win-unicode-console
to print Unicode to Windows console .
关于python - 为什么 sys.getdefaultencoding() 与 sys.stdout.encoding 不同?这如何破坏 Unicode 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530635/
我还没有找到太多关于何时使用 Unicode 的(简明)信息。我知道很多人说最佳实践是始终使用 Unicode。但 Unicode 字符串确实有更多的内存占用。我是否正确地说,必须仅在以下情况下使用
我正在构建一个需要使用表情符号的应用程序,特别是生成大量随机表情符号序列。这需要有一个大列表可供选择。而不是采取方法 detailed here通过循环硬编码十六进制范围,我决定采用不同的方法并从 t
早在 ZX Spectrum 的早期,就有一种方法可以将一个字形打印在另一个字形之上,从而在 OVER 1 指令的帮助下创建复合字形。 我想知道是否有 Unicode 方法可以在现代计算机上执行相同的
我有一个表示 Unicode 代码点的字符串,例如 "272d"。如何将其转换为 "✭"? Elixir 当然理解 Unicode: iex> > "✭" iex> "x{272d}" "✭" 但我需
自从我了解到 clang 能够编译用 Unicode 编写的 c++ 源文件后,我在编写与数学相关的代码时就开始大量使用它。比较 uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁; uₙ₊₁ᶜ = π *
感谢jmcnamara我发现了一种在 xlsxwriter 图表中使用 Unicode 字符的好方法:xlsxwrter: rich text format in chart title 我需要一个所
有些字符不包含在 Unicode 中(即带重音的西里尔字母),但可以使用组合序列创建。据我了解,可能的组合字符序列是在布局引擎和/或使用的字体中定义的。我对吗?那么,如何得到所有可能的组合序列呢? 最
我正在尝试使用 libunibreak ( https://github.com/adah1972/libunibreak ) 来标记某些给定 unicode 文本中可能的换行符。 Libunibre
我需要具有属性 Alphabetic 的 Unicode 字符范围列表如 http://www.unicode.org/Public/5.1.0/ucd/UCD.html#Alphabetic 中所定
我想为 Unicode 中的特定字符找到视觉上相同的字符。 我知道如何找到一个字符的规范或兼容性分解;但他们没有给我我想要的。 我想找到视觉上相同(不相似)的字符,它们唯一的区别可能是它们的大小。 例
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
我已经阅读了很多文章以了解 Unicode 代码点的最大数量,但我没有找到最终答案。 我知道 Unicode 代码点已最小化,以使所有 UTF-8 UTF-16 和 UTF-32 编码都能够处理相同数
我正在使用 CSS Buttons With Icons But No Images . 图标是使用 unicode 值生成的。在这方面,我遇到了一些浏览器不支持某些 unicode 值的问题。因此,
我正在寻找一种方法将 Unicode 字母字符从任何语言音译为带重音的拉丁字母。目的是让外国人深入了解以任何非拉丁文字书写的姓名和单词的发音。 例子: 希腊语:Romanize("Αλφαβητικό
Unicode 6.0 添加了几个带有描述的字符,表明这些字符应该以特定颜色呈现: 红苹果 U+1F34E 青苹果 U+1F34F 蓝心U+1F499 绿心U+1F49A 黄心U+1F49B 紫心U+
我想知道,Unicode 中的每个字符都有一个代码点;字体中字符的类似术语是什么? 当解码文件需要映射到字体(或字体,通过一些现代字体替换技术)时,我从来没有理解过程的一部分。 例如,当文本编辑器从其
谁能告诉我 Unicode 可打印字符的范围是多少? [例如。 Ascii 可打印字符范围为\u0020 -\u007f] 最佳答案 参见,http://en.wikipedia.org/wiki/U
鉴于Unicode有been around for 18 years ,为什么还有不支持 Unicode 的应用程序?甚至我对某些操作系统和 Unicode 的体验至少可以说是痛苦的。正如乔尔·斯波尔
我要求计算 Unicode 中所有可能的有效组合的数量并附上解释。我知道一个 char 可以编码为 1、2、3 或 4 个字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它应该有多长。
Unicode 为中文字符分配了 U+4E00..U+9FFF。这是全套的一部分,但不是全部。 最佳答案 最终列表可以在 Unicode Character Code Charts 找到;在页面中搜索
我是一名优秀的程序员,十分优秀!