带有python和fileinput的Unicode文件

5xu*_*xum 7 python utf-8

我越来越相信文件编码业务的目的是尽可能地混淆.我在读取utf-8只包含一行的编码文件时遇到问题:

“blabla this is some text”
Run Code Online (Sandbox Code Playgroud)

(请注意,引号是标准引号的一些奇特版本).

现在,我Python在其上运行这段代码:

import fileinput
def charinput(paths):
    with open(paths) as fi:
        for line in fi:
            for char in line:
                yield char
i = charinput('path/to/file.txt')
for item in i:
    print(item)
Run Code Online (Sandbox Code Playgroud)

有两个结果:如果我从命令提示符运行我的python代码,结果是一些奇怪的字符,后跟一个错误消息:

?
»
?
â
Traceback (most recent call last):
  File "krneki.py", line 11, in <module>
    print(item)
  File "C:\Python34\lib\encodings\cp852.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position
0: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

我得到这个问题来自于一个事实,即Python的尝试读取"错误"编码的文件,但有没有办法责令想法fileinput.input阅读utf-8


编辑:一些非常奇怪的东西正在发生,我知道它是如何工作的.保存与之前相同的文件后notepad++,python代码现在在IDLE中运行并导致以下输出(删除换行符):

?»?â€?blabla this is some textâ€?
Run Code Online (Sandbox Code Playgroud)

如果我第一次输入,我可以得到命令提示不崩溃chcp 65001.运行该文件然后导致

Ä»żâ€śblabla this is some text ”
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?如果你问我,这是一个可怕的混乱,但我理解它是至关重要的...

Yur*_*rim 11

编码

每个文件都经过编码.字节0x4C根据ASCII编码被解释为拉丁大写字母L,但根据EBCDIC编码被解释为小于号('<').没有像平原那样的东西.

像ASCII这样的单字节字符集使用单个字节来编码每个符号,有像KS X 1001这样的双字节字符集,它们使用两个字节来编码每个符号,并且有像流行的UTF-8这样的编码使用每个符号可变的字节数.

UTF-8已经成为新应用程序最流行的编码,所以我举几个例子:拉丁大写字母A存储为单个字节:0x41.在左双引号(")存储为三个字节:0xE2 0x80 0x9C.表情符号堆的Poo存储为四个字节:0xF0 0x9F 0x92 0xA9.

任何读取文件并必须将字节解释为符号的程序必须知道(或猜测)使用了哪种编码.

如果您不熟悉Unicode或UTF-8,可能需要阅读http://www.joelonsoftware.com/articles/unicode.html

在Python 3中读取文件

Python 3的内置函数open()有一个可选的关键字参数,encoding以支持不同的编码.要打开UTF-8编码文件,您可以编写open(filename, encoding="utf-8"),Python将负责解码.

此外,该fileinput模块通过openhook关键字参数支持编码:fileinput.input(filename, openhook=fileinput.hook_encoded("utf-8")).

如果你不熟悉Python和Unicode或UTF-8,你应该阅读http://docs.python.org/3/howto/unicode.html 我也在http://www.chirayuk.com/找到了一些不错的技巧代码段/蟒/ unicode的

阅读Python中的字符串2

在Python 2 open()中不知道编码.相反,您可以使用该codecs模块指定应使用的编码:codecs.open(filename, encoding="utf-8")

Python2/Unicode启发的最佳来源是http://docs.python.org/2/howto/unicode.html