我正在制作纸牌游戏,但我遇到了似乎是一个编码问题.我正在尝试打印这样一张卡片:
def print(self):
print("|-------|")
print("| %s |" % self.value)
print("| |")
print("| %s |" % self.suit.encode("utf-8"))
print("| |")
print("| %s |" % self.value)
print("|-------|")
Run Code Online (Sandbox Code Playgroud)
这就是我要的:
|-------|
| 10 |
| |
| ? |
| |
| 10 |
|-------|
Run Code Online (Sandbox Code Playgroud)
......但这就是我得到的:
|-------|
| 10 |
| |
| b'\xe2\x99\xa6' |
| |
| 10 |
|-------|
Run Code Online (Sandbox Code Playgroud)
如果重要的话,我在Windows和Python 3上.
self.suit的值可以是以下任何一个:
spade = "?"
heart = "?"
diamond = "?"
club = "?"
Run Code Online (Sandbox Code Playgroud)
如果我删除.encode("utf-8"),我会收到此错误:
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>
Run Code Online (Sandbox Code Playgroud)
这利用了Windows控制台中的OEM代码页为控制字符打印一些可见字符的事实.该卡西服cp437和cp850是chr(3)-chr(6).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))
?
Run Code Online (Sandbox Code Playgroud)
因此:
#!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("?????????")
Run Code Online (Sandbox Code Playgroud)
输出:
>>> x=Card('K',4)
>>> x.print()
?????????
| K |
| |
| ? |
| |
| K |
?????????
>>> x=Card(10,3)
>>> x.print()
?????????
| 10 |
| |
| ? |
| |
| 10 |
?????????
Run Code Online (Sandbox Code Playgroud)
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('?????????')
Run Code Online (Sandbox Code Playgroud)
输出:
>>> x=Card('10',3)
>>> x.print()
?????????
| 10 |
| |
| ? |
| |
| 10 |
?????????
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4056 次 |
| 最近记录: |