Python字符串无法在PowerShell中正确打印

时间:2016-07-31 20:54:29

标签: python powershell unicode encoding

我在使用Python 2.7解析大量科学和国际符号的数据时遇到了困难所以我编写了一个玩具程序来说明对我来说没有意义的东西:

#!/usr/bin/python
# coding=utf-8
str ="35 μg/m3"
str = str.decode('utf-8') 
str = str.encode('utf-8') #ready for printing? 
print(str)

而不是打印出原始内容,我得到了不同的东西:

screen copy

3 个答案:

答案 0 :(得分:0)

# coding=utf-8仅有助于编写unicode文字,对普通字节字符串没有用处。无论如何,假设您的Python文件是UTF-8编码,行str = str.decode('utf-8')会为您提供正确的unicode字符串。

但正如Ansgar Wiechers所说,当您声明编码时,更简单的方法是直接使用unicode litteral:

str = u"35 μg/m3"

简单来说,Windows控制台对UTF8的支持很差。常见的编码是win1252(latin1变体),或cp850是原生OEM字体。除非您想明确处理显式编码,否则最好直接显示 unicode 字符串:

#!/usr/bin/python
# coding=utf-8
str ="35 μg/m3"
str = str.decode('utf-8') # str is now an unicode string
print(str)

如果您想明确使用latin1,并且如果您使用TrueType字体,例如Lucida Console或Consolas,您可以这样做:

chcp 1252
python .\encoding.py

#!/usr/bin/python
# coding=utf-8
str ="35 μg/m3"
str = str.decode('utf-8') # str is now an unicode string
str = str.encode('latin1') # str is now an latin1 encoded byte string
print(str)

答案 1 :(得分:0)

Python 2.7默认情况下不使用Unicode字符串,因此您基本上有两个选项:

  • 将字符串定义为Unicode字符串文字(<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <title>jQuery UI Datepicker - Default functionality</title> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery- ui.css" /> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> </head> <body> <div> <form action="jquery.php" method="post"> Date:<input type="text" id="datepicker" name="datepicker" /> </form> </div> <script> $(function() { $.datepicker.setDefaults( $.datepicker.regional[ "" ] ); $( "#datepicker" ).datepicker({ onSelect: function (dateText, inst) { $(this).parent('form').submit(); } }); }); </script> </body> </html> ):

    u"..."

    这样你就可以按照人们的预期使用字符串,所以我更喜欢这种方法。

  • 将字符串定义为常规字符串文字并对其进行解码:

    # coding=utf-8
    str = u"35 µg/m3"
    print(str)
    

    如果使用此方法,则需要将特殊字符作为十六进制值(UTF-8中的# coding=utf-8 str = "35 \xc2\xb5g/m3" print(str.decode('utf-8')) 是字符序列0xC2,0xB5),即使文件保存为UTF-8。

演示:

PS C:\> $PSVersionTable.PSVersion.ToString()
4.0
PS C:\> C:\Python27\python.exe -V
Python 2.7.11
PS C:\> Get-Content .\test.py -Encoding UTF8
# coding=utf-8
str1 = "35 \xc2\xb5g/m3"
print(str1)
print(str1.decode('utf-8'))
str2 = u"35 µg/m3"
print(str2)
PS C:\> C:\Python27\python.exe .\test.py
35 ┬Ág/m3
35 µg/m3
35 µg/m3

答案 2 :(得分:0)

您的解码/编码无效:

# coding=utf-8
s1 = "35 μg/m3"
s2 = s1.decode('utf-8') 
s3 = s2.encode('utf-8') #ready for printing?
print s1==s3

如果您的源是声明的UTF-8,那么s1是一个已经UTF-8编码的字节字符串。将其解码为Unicode字符串(s2)并将其重新编码为UTF-8只会为您提供原始字节字符串。

接下来,Windows控制台不会默认为UTF-8,因此打印这些字节将在控制台编码中对它们进行解释,这在我的系统上是:

import sys
print sys.stdout.encoding
print s3

输出:

cp437
35 ┬╡g/m3

打印Unicode字符串并正确解释它们的正确方法是实际打印Unicode字符串。它们将被Python编码为控制台编码并正确显示(假设控制台字体和编码支持字符)。

# coding=utf-8
s = u"35 µg/m3"
print s

输出:

35 µg/m3