- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道类似的问题已经被问过一百万次了,但是尽管阅读了很多问题,我还是找不到适合我情况的解决方案。
我有一个 django 应用程序,我在其中创建了一个管理脚本。该脚本读取一些文本文件,并将它们输出到终端(稍后它将对内容做更多有用的事情,但我仍在对其进行测试)并且字符带有转义序列,如 \xc3\xa5
而不是预期的å
.由于该转义序列意味着 Ã¥
,这是对 å
的常见误解。由于编码问题,我怀疑至少有两个地方出了问题。但是,我不知道在哪里 - 我已经检查了我能想到的所有可能的罪魁祸首:
echo $LANG
给 en_US.UTF-8
file *
在它们所在的目录中,所有条目都被列为“UTF-8 Unicode 文本”,除了一个不包含任何非 ASCII 字符并被列为“ASCII 文本”的条目。运行iconv -f ascii -t utf8 thefile.txt > utf8.txt
在该文件上生成另一个具有 ASCII 文本编码的文件。 # -*- encoding: utf-8 -*-
在顶部;前面唯一的一行是 #!/usr/bin/python3
,但我都尝试过更改为 .../python
对于 Python 2.7 或将其完全删除以将其留给 Django,但没有结果。 lines = file.readlines()
的文件并使用标准
print()
打印功能。两端都不会发生手动编码或解码。
print(sys.getdefaultencoding(), sys.stdout.encoding, f.encoding)
产量 ('ascii', 'UTF-8', None)
对于所有文件。 print(lines[0].strip())
工作正常,但 print(lines[0].strip(), lines[1].strip())
才不是。添加 .decode('utf-8')
产生一个元组,其中两个字符串都标有前置 u
和 \xe5
( å
的正确转义序列)而不是之前的奇数字符 - 但我不知道如何将它们打印为常规字符串,没有转义字符。我测试了另一个对 .decode('utf-8')
的调用以及包装str()
但都失败了UnicodeEncodeError
提示\xe5
不能用 ascii 编码。由于单个字符串可以正常工作,我不知道还要测试什么。 # -*- coding: utf-8 -*-
import os, sys
for root,dirs,files in os.walk('txt-songs'):
for filename in files:
with open(os.path.join(root,filename)) as f:
print(sys.getdefaultencoding(), sys.stdout.encoding, f.encoding)
lines = f.readlines()
print(lines[0].strip()) # works
print(lines[0].strip(), lines[1].strip()) # does not work
最佳答案
这里最大的问题是您将 Python 2 和 Python 3 混合在一起。特别是,您编写了 Python 3 代码,并且尝试在 Python 2.7 中运行它。但在此过程中还有一些其他问题。所以,让我试着解释所有的问题。
I started compiling an SSCCE, and quickly found that the problem is only there if I try to print the value in a tuple. In other words,
print(lines[0].strip())
works fine, butprint(lines[0].strip(), lines[1].strip())
does not.
str
元组(或任何其他集合)包括
repr
,而不是
str
,它的元素。解决此问题的简单方法是不打印集合。在这种情况下,根本没有理由打印一个元组。您拥有它的唯一原因是您已经为打印而构建了它。只需执行以下操作:
print '({}, {})'.format(lines[0].strip(), lines[1].strip())
print tuple(map(str, my_tuple))
print '({})'.format(', '.join(map(str, my_tuple)))
str
.
unicode
和
str
是同一类型。但在 Python 2 中,它是
bytes
和
str
是相同的类型,和
unicode
是不同的。因此,在 2.x 中,您没有
str
然而,这就是为什么您需要调用
str
.
print(lines[0].strip(), lines[1].strip())
的原因打印一个元组。在 Python 3 中,这是对
print
的调用。以两个字符串作为参数的函数,因此它将打印出由空格分隔的两个字符串。在 Python 2 中,它是
print
带有一个参数的语句,它是一个元组。
six.print_
这样的包装器。 ,或执行
from __future__ import print_function
,或者要非常小心地做一些丑陋的事情,比如添加额外的括号,以确保你的元组在两个版本中都是元组。
str
对象,您只需将它们打印出来。在 2.x 中,您有
unicode
对象,而您正在打印出它们的
repr
.您可以更改它以打印出他们的
str
,或者首先避免打印元组……但这仍然无济于事。
str
然后将其传递给
sys.stdio.write
.但在 3.x 中,
str
表示
unicode
, 和
sys.stdio
是
TextIOWrapper
;在 2.x 中,
str
表示
bytes
, 和
sys.stdio
是二进制
file
.
sys.stdio.wrapped_binary_file.write(s.encode(sys.stdio.encoding, sys.stdio.errors))
sys.stdio.write(s.encode(sys.getdefaultencoding()))
print(sys.getdefaultencoding(), sys.stdout.encoding, f.encoding)
yields('ascii', 'UTF-8', None)
io.TextIOWrapper
模拟 Python 3或
codecs.StreamWriter
然后使用
print >>f, …
或
f.write(…)
而不是
print
,或者您可以显式编码您的所有
unicode
像这样的对象:
print '({})'.format(', '.join(element.encode('utf-8') for element in my_tuple)))
关于Python 不能正确解释 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681712/
UTF-8、UTF-16 和 UTF-32 之间有何区别? 据我所知,它们都将存储 Unicode,并且每个都使用不同数量的字节来表示字符。选择其中之一是否有优势? 最佳答案 当 ASCII 字符代表
好的。我知道这看起来像典型的“他为什么不直接用谷歌搜索或去 www.unicode.org 查一下?”问题,但对于这样一个简单的问题,在检查了两个来源后,我仍然无法回答。 我很确定这三种编码系统都支持
是否存在可以用 UTF-16 编码但不能用 UTF-8 编码的字符 最佳答案 没有。 UTF-* 是可以对全范围 Unicode 字符进行编码的编码。 编码之间的差异在于每个字符使用多少字节。 关于u
是否存在可以用 UTF-16 编码但不能用 UTF-8 编码的字符 最佳答案 没有。 UTF-* 是可以对全范围 Unicode 字符进行编码的编码。 编码之间的差异在于每个字符使用多少字节。 关于u
UTF-16 是一种双字节字符编码。交换两个字节的地址将产生 UTF-16BE 和 UTF-16LE。 但我发现在 Ubuntu gedit 文本编辑器中存在名称 UTF-16 编码,以及 UTF-1
我想将 UTF-16 字符串转换为 UTF-8。我通过 Unicode 发现了 ICU 库。我在转换时遇到问题,因为默认设置是 UTF-16。我试过使用转换器: UErrorCode myError
UTF-16 需要 2 个字节,UTF-8 需要 1 个字节。 而USB是面向8bit的,UTF-8更自然。 UTF-8 向后兼容 ASCII,而 UTF-16 则不然。 UTF-16 需要 2 个字
我对将 unicode 字符转换为十六进制值有点困惑。 我正在使用这个网站获取字符的十六进制值。 ( https://www.branah.com/unicode-converter ) 如果我输入“
我已经用UTF-8编码创建了一个文件,但是我不了解其在磁盘上占用的大小的规则。这是我的完整研究: 首先,我创建了一个带有印地语字母“'”的文件,Windows 7上的文件大小为 8个字节。 现在带有两
如何将WideString(或其他长字符串)转换为UTF-8中的字节数组? 最佳答案 这样的功能将满足您的需求: function UTF8Bytes(const s: UTF8String): TB
我有一个奇怪的验证程序,用于验证utf-8字符串是否是有效的主机名(PHP中的Zend Framework主机名valdiator)。它允许IDN(国际化域名)。它将比较每个子域与由其十六进制字节表示
在 utf16 和 utf32 中,一个字节的零是否意味着空?就像在 utf8 中一样,还是我们需要 2 个和 4 个字节的零来相应地在 utf16 和 utf32 中创建 null? 最佳答案 在
这是基于我的观察,对于 mysql,默认字符集 utf8 有点误导,它不支持完整的 Unicode,因为它无法存储四字节 UTF-8 编码的字符。它实际上是 utf8mb4 字符集,它是完整的 Uni
我只有处理 ASCII(单字节字符)的经验,并且阅读了很多关于人们如何以不同方式处理 Unicode 的帖子,这些帖子提出了他们自己的一系列问题。 此时我对 Unicode 的了解非常有限,我读到过U
我明白 std::codecvt在 C++11 中执行 UTF-16 和 UTF-8 之间的转换,并且 std::codecvt执行 UTF-32 和 UTF-8 之间的转换。是否可以在 UTF-8
我正在编写一个 HTTP 服务器并使用 trivial-utf-8:write-utf-8-bytes 来响应请求。我听说Babel就像trivial-utf-8但效率更高,所以我想试一试。搜索了一段
我正在设计一个新的 CMS,但想要设计它来满足我 future 的所有需求,比如多语言内容,所以我认为 Unicode (UTF-8) 是最好的解决方案 但是通过一些搜索我得到了这篇文章 http:/
例如,假设我在字符串中有以下 xml: 如果我尝试将其插入到带有 Xml 列的 SQL Server 2005 数据库表中,我将收到以下错误(我使用的是 EF 4.1,但我认为这无关紧要): XM
我正在使用 Python CSV 库读取两个 CSV 文件。 一种使用 UTF-8-BOM 编码,另一种使用 UTF-8 编码。在我的实践中,我发现使用“utf-8-sig”作为编码类型可以读取这两个
假设我的数据库设置如下以使用 utf-8(mysql 中的完整 4mb 版本) mysql_query("SET CHARACTER SET utf8mb4"); mysql_query("SET N
我是一名优秀的程序员,十分优秀!