简体   繁体   English

Python打印Unicode字符

[英]Python print Unicode character

I'm making a card game, but I've run into what seems to be an encoding issue. 我正在制作纸牌游戏,但我遇到了似乎是一个编码问题。 I'm trying to print a card like this: 我正在尝试打印这样一张卡片:

def print(self):
    print("|-------|")
    print("| %s     |" % self.value)
    print("|       |")
    print("|   %s   |" % self.suit.encode("utf-8"))
    print("|       |")
    print("|    %s  |" % self.value)
    print("|-------|")

This is what I want: 这就是我要的:

|-------|
| 10    |
|       |
|   ♦   |
|       |
|    10 |
|-------|

...but this is what I get: ......但这就是我得到的:

|-------|
| 10    |
|       |
|   b'\xe2\x99\xa6'   |
|       |
|    10 |
|-------|

I'm on Windows and Python 3 if that matters. 如果重要的话,我在Windows和Python 3上。

The value of self.suit can be any of the following: self.suit的值可以是以下任何一个:

spade = "♠"
heart = "♥"
diamond = "♦"
club = "♣"

If I remove the .encode("utf-8") I get this error: 如果我删除.encode(“utf-8”),我会收到此错误:

Traceback (most recent call last): Traceback(最近一次调用最后一次):

  File "main.py", line 79, in <module>
    start()
  File "main.py", line 52, in start
    play()
  File "main.py", line 64, in play
    card.print()
  File "main.py", line 36, in print
    print("|   \u2660   |")
  File "C:\Python34\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2660' in position
4: character maps to <undefined>

This takes advantage of the fact that the OEM code pages in the Windows console print some visible characters for control characters. 这利用了Windows控制台中的OEM代码页为控制字符打印一些可见字符的事实。 The card suits for cp437 and cp850 are chr(3)-chr(6) . 适用于cp437cp850的卡适用于chr(3)-chr(6) Python 3 (prior to 3.6) won't print the Unicode character for a black diamond, but it's what you get for U+0004: Python 3(3.6之前的版本)不会为黑色菱形打印Unicode字符,但它是你为U + 0004获得的:

>>> print('\N{BLACK DIAMOND SUIT}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2666' in position 0: character maps to <undefined>
>>> print(chr(4))
♦

Therefore: 因此:

#!python3
#coding: utf8
class Card:
    def __init__(self,value,suit):
        self.value = value
        self.suit = suit    # 1,2,3,4 = ♥♦♣♠

    def print(self):
        print("┌───────┐")
        print("| {:<2}    |".format(self.value))
        print("|       |")
        print("|   {}   |".format(chr(self.suit+2)))
        print("|       |")
        print("|    {:>2} |".format(self.value))
        print("└───────┘") 

Output: 输出:

>>> x=Card('K',4)
>>> x.print()
┌───────┐
| K     |
|       |
|   ♠   |
|       |
|     K |
└───────┘
>>> x=Card(10,3)
>>> x.print()
┌───────┐
| 10    |
|       |
|   ♣   |
|       |
|    10 |
└───────┘

Python 3.6 Update Python 3.6更新

Python 3.6 uses Windows Unicode APIs to print so no need for the control character trick now, and the new format strings can be used: Python 3.6使用Windows Unicode API进行打印,因此现在不需要控制字符技巧,可以使用新的格式字符串:

#!python3.6
#coding: utf8
class Card:
    def __init__(self,value,suit):
        self.value = value
        self.suit = '♥♦♣♠'[suit-1] # 1,2,3,4 = ♥♦♣♠

    def print(self):
        print('┌───────┐')
        print(f'| {self.value:<2}    |')
        print('|       |')
        print(f'|   {self.suit}   |')
        print('|       |')
        print(f'|    {self.value:>2} |')
        print('└───────┘') 

Output: 输出:

>>> x=Card('10',3)
>>> x.print()
┌───────┐
| 10    |
|       |
|   ♣   |
|       |
|    10 |
└───────┘

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM