Unicode не печатает правильно до cp850 (cp437), масти игральных карт - PullRequest
3 голосов
/ 20 ноября 2010

Подводя итог: Как я могу печатать Unicode-систему независимо, чтобы производить символы игровых карт?

Что я делаю неправильно, я считаю себя достаточно свободно в Python, за исключением того, что я не могупечатайте правильно!

# coding: utf-8
from __future__ import print_function
from __future__ import unicode_literals
import sys

symbols = ('♥','♦','♠','♣')
# red suits to sdterr for IDLE
print(' '.join(symbols[:2]), file=sys.stderr)
print(' '.join(symbols[2:]))

sys.stdout.write(symbols) # also correct in IDLE
print(' '.join(symbols))

Печать на консоль, которая является основным условием для консольного приложения, с треском проваливается, хотя:Вы используете не консоль, а IDLE.

Конечно, я могу генерировать символы самостоятельно, создавая их с помощью chr:

# correct symbols for cp850
print(''.join(chr(n) for n in range(3,3+4)))

Но это выглядит очень глупо.И я не заставляю программы работать только в Windows или во многих особых случаях (например, условная компиляция).Мне нужен читаемый код.

Я не против, какие буквы он выводит, если он выглядит правильно, независимо от того, является ли это телефоном Nokia, Windows или Linux. Юникод должен это делать, но он не печатается правильно в Консоль

Ответы [ 4 ]

2 голосов
/ 20 ноября 2010

Всякий раз, когда мне нужно вывести символы utf-8, я использую следующий подход:

import codecs

out = codecs.getwriter('utf-8')(sys.stdout)

str = u'♠'

out.write("%s\n" % str)

Это спасает меня encode('utf-8') каждый раз, когда нужно что-то отправить в sdtout / stderr.

1 голос
/ 20 ноября 2010

Используйте строки Unicode и модуль codecs:

Или:

# coding: utf-8
from __future__ import print_function
import sys
import codecs

symbols = (u'♠',u'♥',u'♦',u'♣')

print(u' '.join(symbols))
print(*symbols)
with codecs.open('test.txt','w','utf-8') as testfile:
    print(*symbols, file=testfile)

или

# coding: utf-8
from __future__ import print_function
from __future__ import unicode_literals
import sys
import codecs

symbols = ('♠','♥','♦','♣')

print(' '.join(symbols))
print(*symbols)
with codecs.open('test.txt','w','utf-8') as testfile:
    print(*symbols, file=testfile)

Нет необходимости повторно внедрять print.

1 голос
/ 20 ноября 2010

В ответ на обновленный вопрос

Поскольку все, что вы хотите сделать, это распечатать символы UTF-8 на CMD, вам не повезло, CMD не поддерживаетUTF-8:
Существует ли командная оболочка Windows, которая будет отображать символы Юникода?

Старый ответ

Не совсем понятно, чтоВы пытаетесь сделать это здесь, мой лучший выбор в том, что вы хотите записать в кодировке UTF-8 в файл.

Ваши проблемы:

  1. symbols = ('♠','♥', '♦','♣') в то время как кодировка вашего файла может быть UTF-8, если вы не используете Python 3, ваши строки по умолчанию не будут UTF-8, вам нужно добавить к ним префикс с небольшим u:
    symbols = (u'♠', u'♥', u'♦', u'♣')

  2. Ваш str(arg) преобразует строку Unicode обратно в обычную, просто оставьте ее или используйте unicode(arg) для преобразования в строку Unicode

  3. Имена .decode() могут сбивать с толку, это декодирует байты в UTF-8, но вам нужно кодировать UTF-8 в байтах, поэтому используйте .encode()

  4. Вы не записываете в файл в двоичном режиме, вместо open('test.txt', 'w') вам нужно использовать open('test.txt', 'wb') (обратите внимание на wb) это откроет файл в двоичном режиме, который важен для windows

Если мы соберем все это вместе, мы получим:

# -*- coding: utf-8 -*-
from __future__ import print_function
import sys

symbols = (u'♠',u'♥', u'♦',u'♣')

print(' '.join(symbols))
print('Failure!')

def print(*args,**kwargs):
    end = kwargs[end] if 'end' in kwargs else '\n'
    sep = kwargs[sep] if 'sep' in kwargs else ' '
    stdout = sys.stdout if 'file' not in kwargs else kwargs['file']
    stdout.write(sep.join(unicode(arg).encode('utf-8') for arg in args))
    stdout.write(end)

print(*symbols)
print('Success!')
with open('test.txt', 'wb') as testfile:
    print(*symbols, file=testfile)

Это счастливо пишетбайт , закодированный UTF-8 в файл (по крайней мере, на моем Ubuntu поле здесь).

0 голосов
/ 20 ноября 2010

UTF-8 в консоли Windows - длинная и болезненная история.

Вы можете прочитать выпуск 1602 и выпуск 6058 и получить что-то, что работает, большеили меньше, но оно хрупкое.

Позвольте мне резюмировать:

  • добавить 'cp65001' в качестве псевдонима для 'utf8' в Lib/encodings/aliases.py
  • select Lucida Console или Consolas в качестве шрифта консоли
  • run chcp 65001
  • run python
...