python - “外来”字符在列表的最后位置时丢失

标签 python encoding

我有一个像这样的简单 Python (2.7.10) 程序:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

with open("test.txt") as f:
    input = f.readlines()

for i in input:
    l = list(i)
    mystring = ""
    for j in l:
        mystring += j
        print mystring, '\n',

文本文件“test.txt”包含以下内容:

AAAÖÖAAA

然而,当我运行代码时,每次“Ö”位于 mystring 的末尾时,它都被输出为“?”,如下所示:

A 
AA 
AAA 
AAA? 
AAAÖ 
AAAÖ? 
AAAÖÖ 
AAAÖÖA 
AAAÖÖAA 
AAAÖÖAAA 
AAAÖÖAAA 

如果我改为在 Python 3 上运行代码(必须将打印语句更改为 'print(mystring),'),输出正确:

A
AA
AAA
AAAÖ
AAAÖÖ
AAAÖÖA
AAAÖÖAA
AAAÖÖAAA
AAAÖÖAAA

有人知道为什么会发生这种情况以及如何解决吗?我试过谷歌搜索,但没有真正找到任何东西。

最佳答案

您正在打印 UTF-8 bytes .

UTF-8 是一种可变字节编码;它将使用 1 到 4 个字节之间的任何位置来编码给定的 Unicode 代码点。 Ö 在 UTF-8 中编码为 两个 字节,而字母 A 只需要一个字节:

>>> u'Ö'.encode('utf8')
'\xc3\x96'
>>> u'A'.encode('utf8')
'A'

仅打印第一个字节(十六进制 C3)不是有效的 UTF-8 输出,因此您的终端使用 ? 来指示它无法解码您打印的数据。在我的 Mac 终端上,U+FFFD REPLACEMENT CHARACTER 在这种情况下打印字符:

>>> print u'Ö'.encode('utf8')
Ö
>>> print u'Ö'.encode('utf8')[0]
�
>>> print u'Ö'.encode('utf8')[1]
�

如果您首先将数据解码为 unicode 对象,则可以迭代 代码点 而不是字节:

for i in input:
    l = list(i.decode('utf8'))

请注意,您不必为了迭代而对对象调用 list()。遍历一个字符串已经为您提供了单独的字符。

您也可以使用 io.open() 打开文件;这给你一个文件对象,在阅读时默认给你 unicode 对象,前提是你告诉它使用什么编解码器:

import io

with io.open("test.txt", encoding='utf8') as f:
    input = f.readlines()

关于python - “外来”字符在列表的最后位置时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35177347/

相关文章:

oracle - Oracle 中的 UTF-8 字符

php - 如何使用 php 从 mysql 推送 latin-2 字符

python - 将模块从 opencv_contrib 添加到 OpenCV

python - 根据bp坐标提取fasta序列的一部分

python - 忽略 Python 中的编码错误(iterparse)?

java - 如何使用 slf4j 以其他语言(例如日语)记录文本

java - 以编程方式检查是否支持编码

python - 过滤行将结果保存在新列中

python - 从模糊 wuzzypartial_ratio 获得不正确的分数

python - 计算 Python/pandas 数组中的连续正值