带有 python 的口音
Accents with python
我想知道如何在 python 中保留重音,如果我们可以向自己解释一下它是如何工作的,我会花几个小时搜索。我还是什么都不懂 x)
示例 1:
text = "Danay Suarèz hablé"
print(text)
输出:
Danay Suar▒z habl▒
示例 2:
print(text.encode('utf-8'))
输出:
b'Danay Suar\xc3\xa8z habl\xc3\xa9'
我只想输出:Danay Suarèz hablé
试试这个:
import sys
def sys_out(out_data):
try:
print(out_data) # or change this line to sys.stdout.write(out_data)
except UnicodeEncodeError:
if sys.version_info >= (3,):
print(out_data.encode('utf8').decode(sys.stdout.encoding))
else:
print(out_data.encode('utf8'))
sys_out("Danay Suarèz hablé")
注意:但通常,这取决于您的文本查看器....它是否支持其他编码(例如 utf-8)。
祝你好运...
计算机以位为单位工作,因此 1 和 0 的序列(它们的物理存储方式是另一回事)。整数通常保存为 16 个 1 和 0,所以 51 = 00000000 00110011。因为这很长,我们通常用十六进制来写,所以 2 dec = 00 33 hex。但不仅数字被保存为位,字符(以及基本上所有其他内容)也是。虽然我们可以 "naturally" 以位(二进制)编码整数,但其他数据类型更难。对于字符,"normal" 方式是 ASCII,它只是将 "randomly" 字节序列映射到字符。在 ASCII 00 33 = "3".
但是ASCII只声明了128个(7位)不同的字符。这对于英语加上一些额外的字符来说已经足够了,但对于其他语言来说还不够。所以人们创造了很多编码,主要是为了他们在他们的语言中使用的字符。因此,虽然 ASCII 表示 00 33 =“3”,但其他编码可能表示 00 33 =“ü”或其他任何内容。人们遇到的大多数编码实际上在前 128 个字符上与 ASCII 一致,但对其进行了扩展。
你的 sys.stdout.encoding
说它是 UTF8
所以 python 把你的 è
转换成字节 C3 A8。现在你的命令行 codepage 是 850,更广为人知的是 latin1。在 latin1 C3 A8 中应该是 è
(这不是你看到的,所以也许我在某处的翻译中犯了一个错误,或者你的终端没有可以显示它的字体)这与 UTF8 不同。
但是如何解决这个问题呢?要么告诉你的命令行使用 UTF8,要么告诉 python 使用 latin1。在执行脚本之前,您应该能够通过键入 chcp 65001
将命令行编码更改为 UF8。
如果您使用 print(text.encode('utf-8'))
python 尝试显示该对象包含的字节的人类可读版本。它会在可能的情况下将字节解释为 ASCII,而在没有的地方只显示原始位。所以 \xc3\xa8
表示字节 c3 a8。但是当然,如果您实际打印它会将 UTF8 中的这些符号传输到您的终端,但是因为在 ASCII 范围内 UTF8 和 latin1 确实一致,您的终端会正确解释这些字符。
我想知道如何在 python 中保留重音,如果我们可以向自己解释一下它是如何工作的,我会花几个小时搜索。我还是什么都不懂 x)
示例 1:
text = "Danay Suarèz hablé"
print(text)
输出:
Danay Suar▒z habl▒
示例 2:
print(text.encode('utf-8'))
输出:
b'Danay Suar\xc3\xa8z habl\xc3\xa9'
我只想输出:Danay Suarèz hablé
试试这个:
import sys
def sys_out(out_data):
try:
print(out_data) # or change this line to sys.stdout.write(out_data)
except UnicodeEncodeError:
if sys.version_info >= (3,):
print(out_data.encode('utf8').decode(sys.stdout.encoding))
else:
print(out_data.encode('utf8'))
sys_out("Danay Suarèz hablé")
注意:但通常,这取决于您的文本查看器....它是否支持其他编码(例如 utf-8)。
祝你好运...
计算机以位为单位工作,因此 1 和 0 的序列(它们的物理存储方式是另一回事)。整数通常保存为 16 个 1 和 0,所以 51 = 00000000 00110011。因为这很长,我们通常用十六进制来写,所以 2 dec = 00 33 hex。但不仅数字被保存为位,字符(以及基本上所有其他内容)也是。虽然我们可以 "naturally" 以位(二进制)编码整数,但其他数据类型更难。对于字符,"normal" 方式是 ASCII,它只是将 "randomly" 字节序列映射到字符。在 ASCII 00 33 = "3".
但是ASCII只声明了128个(7位)不同的字符。这对于英语加上一些额外的字符来说已经足够了,但对于其他语言来说还不够。所以人们创造了很多编码,主要是为了他们在他们的语言中使用的字符。因此,虽然 ASCII 表示 00 33 =“3”,但其他编码可能表示 00 33 =“ü”或其他任何内容。人们遇到的大多数编码实际上在前 128 个字符上与 ASCII 一致,但对其进行了扩展。
你的 sys.stdout.encoding
说它是 UTF8
所以 python 把你的 è
转换成字节 C3 A8。现在你的命令行 codepage 是 850,更广为人知的是 latin1。在 latin1 C3 A8 中应该是 è
(这不是你看到的,所以也许我在某处的翻译中犯了一个错误,或者你的终端没有可以显示它的字体)这与 UTF8 不同。
但是如何解决这个问题呢?要么告诉你的命令行使用 UTF8,要么告诉 python 使用 latin1。在执行脚本之前,您应该能够通过键入 chcp 65001
将命令行编码更改为 UF8。
如果您使用 print(text.encode('utf-8'))
python 尝试显示该对象包含的字节的人类可读版本。它会在可能的情况下将字节解释为 ASCII,而在没有的地方只显示原始位。所以 \xc3\xa8
表示字节 c3 a8。但是当然,如果您实际打印它会将 UTF8 中的这些符号传输到您的终端,但是因为在 ASCII 范围内 UTF8 和 latin1 确实一致,您的终端会正确解释这些字符。