Python 3处理的字符串有点不同。最初只有一种类型
字符串:str。当unicode在90年代得到广泛应用时,新的unicode类型
添加到处理Unicode而不破坏先前存在的代码1。这是
实际上与str相同,但支持多字节。
在Python 3中有两种不同的类型:类型。这只是一个字节序列,Python不知道
任何关于如何将其解释为字符的信息。
类型。这也是一个字节序列,但是Python知道如何
将这些字节解释为字符。
已删除单独的unicode类型。str现在支持unicode。
在Python 2中,隐式地假设一个编码可能会导致很多问题;您
可能使用了错误的编码,或者数据在
全部(例如,它是PNG图像)。
显式告诉Python要使用哪个编码(或显式告诉它
猜猜)通常更好,更符合“Python哲学”
在“explicit is better than implicit”中。
此更改与Python2不兼容,因为许多返回值已更改,
导致像这样微妙的问题;这可能是为什么
Python 3的采用非常缓慢。因为Python没有静态类型2
不可能用脚本(例如
2to3)。您可以使用bytes('h€llo', 'utf-8')将str转换为bytes;这应该
生产b'H\xe2\x82\xacllo'。注意一个字符是如何转换为三个字符的
字节。
您可以使用b'H\xe2\x82\xacllo'.decode('utf-8')将bytes转换为str。
当然,在您的情况下,UTF-8可能不是正确的字符集,所以请确保
使用正确的。
在你的特定代码中,nextline是bytes类型,而不是str,
从Python 3中的subprocess读取stdout和stdin从str更改为
bytes。这是因为Python不能确定使用哪种编码。它
可能使用与sys.stdin.encoding(系统编码)相同的方法,
但不能肯定。
您需要替换:sys.stdout.write(nextline)
使用:sys.stdout.write(nextline.decode('utf-8'))
或者可能:sys.stdout.write(nextline.decode(sys.stdout.encoding))
您还需要将if nextline == ''修改为if nextline == b'',因为:>>> '' == b''
False
1使用ASCII有一些简单的技巧,但不能使用多字节字符集;最著名的例子是“带空格的异或来切换大小写”(例如chr(ord('a') ^ ord(' ')) == 'A')和“设置第6位来生成控制字符”(例如ord('\t') + ord('@') == ord('I'))。ASCII是在操作单个位是对性能影响不可忽略的操作时设计的。
2是的,您可以使用函数注释,但它是一个相对较新的功能,很少使用。