我越来越相信文件编码业务的目的是尽可能地混淆.我在读取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的内置函数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 open()
中不知道编码.相反,您可以使用该codecs
模块指定应使用的编码:codecs.open(filename, encoding="utf-8")
Python2/Unicode启发的最佳来源是http://docs.python.org/2/howto/unicode.html