2016-07-31 3 views
0

Я с трудом синтаксический анализ данных с большим количеством научных и международных символов с использованием Python 2.7, так что я написал игрушечный программу, которая иллюстрирует то, что не делает для меня смысл:Python строка не печатает правильно в PowerShell

#!/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

+1

вы не должны кодировать первый, а затем декодировать/непосредственно печатать? –

+2

Вы собираетесь использовать Python3, если вы имеете дело с unicode, если не можете. Или просто как боль. –

+1

Прекрасно работает на Python 2.7.9 ... возможно, попробуйте '# - * - кодирование: latin-1 - * -' ... –

ответ

0

линия # coding=utf-8 только помогает писать юникод буквальным и не использовать для простых строк байт. В любом случае, предполагая, что ваш файл Python кодируется в кодировке UTF-8, строка str = str.decode('utf-8') дает правильную строку в Юникоде.

Но как сказал Ansgar Wiechers, как вы объявить кодировку проще всего было бы непосредственно использовать юникод litteral:

str = u"35 μg/m3" 

Просто консоль для Windows имеет плохую поддержку UTF8. Обычными кодировками являются win1252 (вариант latin1) или cp850 - собственный шрифт OEM. Если вы не хотите явно иметь дело с явным кодирования, лучше всего, чтобы непосредственно отобразить Юникода строку:

#!/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) 
+0

Я думаю, вы смущаете PowerShell с CMD здесь. –

+0

@AnsgarWiechers: AFAIK, OP запускает PowerShell в консоли. Его проблема связана только с консольной кодировкой, а PowerShell выполняет команду 'chcp'. Так что да, этот ответ будет действителен в оболочке cmd.exe, и я не смущаюсь, потому что он также действителен в PowerShell. –

+0

['$ OutputEncoding'] (https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/) - лучший способ справиться с проблемами вывода в PowerShell, независимо от того, как/когда PowerShell был запущен. –

0

Python 2.7 не использует строки Unicode по умолчанию, так что вы в основном есть 2 варианта:

  • задает строку в виде строки Unicode буквальной (u"..."):

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

    Таким образом, вы можете просто используйте строку, как и следовало ожидать, поэтому я бы предпочел этот подход.

  • Определить строку как обычный строковый литерал и декодировать:

    # coding=utf-8 
    str = "35 \xc2\xb5g/m3" 
    print(str.decode('utf-8')) 
    

    Если вы используете этот подход, вы должны поместить специальные символы, как их шестнадцатеричные значения (µ в 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
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-encoded уже. Декодирование его в строку Unicode (s2) и перекодирование его, поскольку UTF-8 просто дает вам исходную байтовую строку.

Далее, консоль Windows, не по умолчанию UTF-8, так что печать этих байт будет intepret их в кодировке консоли, которая в моей системе является:

import sys 
print sys.stdout.encoding 
print s3 

Выход:

cp437 
35 ┬╡g/m3 

Правильный способ печати строк в Юникоде и их правильная настройка - это на самом деле печатать строки Unicode. Они будут закодированы в консольную кодировку Python и отобразятся правильно (при условии, что шрифт консоли и кодировка поддерживают символы).

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

Выход:

35 µg/m3 
Смежные вопросы