Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 哪种编码方法最可靠?_Python_Encoding_Diacritics - Fatal编程技术网

Python 哪种编码方法最可靠?

Python 哪种编码方法最可靠?,python,encoding,diacritics,Python,Encoding,Diacritics,我对python相当陌生,但由于我的母语包含一些讨厌的UMLAUT,我不得不陷入一场噩梦:编码一开始就是正确的。 我阅读了joelonsoftware的编码文本,了解了代码点和字母的实际呈现之间的区别(以及unicode和编码之间的联系)。 为了让我摆脱困境,我找到了3种处理UMLAUT的方法,但我无法决定哪种方法适合什么情况。 如果有人能给它点颜色看看?我希望能够将文本写入文件,从中读取(或sqlite3)并发出文本,所有这些都包括可读的umlauts。。。 非常感谢 # -*- coding

我对python相当陌生,但由于我的母语包含一些讨厌的UMLAUT,我不得不陷入一场噩梦:编码一开始就是正确的。 我阅读了joelonsoftware的编码文本,了解了代码点和字母的实际呈现之间的区别(以及unicode和编码之间的联系)。 为了让我摆脱困境,我找到了3种处理UMLAUT的方法,但我无法决定哪种方法适合什么情况。 如果有人能给它点颜色看看?我希望能够将文本写入文件,从中读取(或sqlite3)并发出文本,所有这些都包括可读的umlauts。。。 非常感谢

# -*- coding: utf-8 -*-
import codecs

# using just u + string
with open("testutf8.txt", "w") as f:
    f.write(u"Österreichs Kapitän")

with open("testutf8.txt", "r") as f:
    print f.read()


# using encode/decode
s = u'Österreichs Kapitän'
sutf8 = s.encode('UTF-8')
with open('encode_utf-8.txt', 'w') as f2:
    f2.write(sutf8)
with open('encode_utf-8.txt','r') as f2:
    print f2.read().decode('UTF-8')


# using codec
with codecs.open("testcodec.txt", "w","utf-8") as f3:
    f3.write(u"Österreichs Kapitän")

with codecs.open("testcodec.txt", "r","utf-8") as f3:
    print f3.read() 
编辑: 我测试了这个(文件的内容是'Österreichs Kapitän'):


我是否必须在代码中的任何地方使用u'string(unicode)?我发现,如果我只使用空白字符串(没有“u”),UMLUUT的替换就不起作用了。

< P>作为一个一般的经验法则,你通常想尽早解码一个编码字符串,然后将它作为Unicode对象进行操作,并最终将其编码为最晚(在将其写入文件之前)。 例如:

with codecs.open("testcodec.txt", "r","utf-8") as f3:
    s = f3.read()

# modify s here

with codecs.open("testcodec.txt", "w","utf-8") as f3:
    f3.write(s)
至于你的问题,哪种方式最好:我认为使用编解码器库和手动编码/解码没有区别。这是一个偏好的问题,两者都有效

简单地使用open(如第一个示例中所示)不起作用,因为python随后将尝试使用默认编解码器(如果没有更改,则为ASCII)对字符串进行编码

关于是否应在所有位置使用unicode字符串的问题: 原则上是的。如果您创建一个字符串
s='asdf'
,它的类型为
str
(您可以使用
type
进行检查),如果您创建了
s2=u'asdf'
它的类型为
unicode
。 而且,由于始终操作unicode对象更好,因此建议使用后者

如果您不想总是在字符串前面附加“u”,可以使用以下导入:

from __future__ import unicode_literals
然后您可以执行
s='asdf'
,s的类型为
unicode
。在Python3中,这是默认设置,因此只有在Python2中才需要导入


对于潜在的陷阱,你可以看看。基本上,您不想混合使用utf-8编码字符串和unicode字符串。

非常感谢,这给了我一些见解。。。张贴代码在注释中不起作用吗?您可以单击注释字段旁边的
help
按钮了解接受的语法(他们称之为迷你标记)。注释中的代码应该用倒勾(`)括起来。谢谢。我是否必须写
u“sterreich”
才能工作,例如替换字母?请参阅我编辑的问题,了解整个示例。。。
from __future__ import unicode_literals