Unicode Python Windows控制台

Unicode Python Windows控制台,python,windows,unicode,utf-8,utf,Python,Windows,Unicode,Utf 8,Utf,我有一个21点游戏的程序。它还没有完成,但我有一个Unicode的问题。当它打印字符串时,它的格式不正确(请看下面)。这是Python 3 from unicurses import * import sys import time from random import choice as rc import random def total(hand): #total aces = hand.count(11) t = sum(hand) if t > 21 a

我有一个21点游戏的程序。它还没有完成,但我有一个Unicode的问题。当它打印字符串时,它的格式不正确(请看下面)。这是Python 3

from unicurses import *
import sys
import time
from random import choice as rc
import random

def total(hand): #total
    aces = hand.count(11)
    t = sum(hand)
    if t > 21 and aces > 0:
        while aces > 0 and t > 21:
            t -= 10
            aces -= 1
    return t

def random(one,two):
    import random
    number = random.randint(one,two)
    return number

def number():
    number = random(1,13)
    if number == 13:
        value = '0'
    elif number == 12:
        value = '0'
    elif number == 11:
        value = '0'
    elif number == 10:
        value = '0'
    elif number < 10:
        value = number
    return value

def card():
    cardnumber = number()
    card = cardnumber
    return card

def store10Cards():
    tenCards = [card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card(),
               card()]
    return tenCards

stdscr = initscr()
cards = store10Cards()

mvaddstr(10, 10, '┌──────────┐\n│{}         │\n│           │\n│            │\n│            │\n│            │\n│            │\n│            │\n│            │\n│         {}│\n└──────────┘'.format(cards[0], cards[0]).encode('utf-8'))


#deck = [] #deck of cards

#cwin = 0 #computer wins
#pwin = 0 #player wins

#for i in range (2, 11):
   # for j in range ([24, 72][i == 10]):
       # deck.append(i)

#stdscr = initscr() #Start the standard screen 

start_color() #Start the color service

init_pair(1, COLOR_RED, 0) #color pair 1 is red text and no highlighting
init_pair(2, COLOR_WHITE, 0) #color pair 2 is white text and no highlighting

addstr('\n\n------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('\n\n\nAre You Ready To Try And Defeat The Undefeated Blackjack Master?\n\n\nThe First One To Win 10 Hands Wins!!!\n\n\nAces Are Counted As 11s And Automaticlly Change To 1 If You Go Over 21. \n\n\nWinning 1 Hand Does Not Mean You Win The Game\n\n\nIt Is Possible To Win But Very Hard!!!                  Good Luck!!!\n\n\n', color_pair(2))
addstr('------------------------------------------------------------------------', color_pair(1) | A_BOLD)
addstr('\n\nDo You Know The Rules Of Blackjack? (Y or N)\n\n', color_pair(2))
addstr('------------------------------------------------------------------------', color_pair(1) | A_BOLD)

refresh() #refreshes

cbreak() #lets user do Ctrl + C

noecho() #Stops inputs from being shown

a = getch() #Gets input

while a == ord('q'): #Checks if input is q
    clear() #clears before exit
    exit() #quits

while a == ord('n'): #Checks if input is n

    clear() #clears before displaying the next text

    addstr('\n\n\n----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
    addstr('\n\nOk. That Is Ok. The Rules Are As Follows: \n\nThe Goal Is To Get To 21.\n\nYou Can Hit A Card (Receive Another) Or Stand And See What The Dealer Has And Does.\n\nThe Person With The Higest Value 21 Or Below Wins That Hand.\n\nAces Start As 11s But Change Automatticly To 1s If You Go Over 21 To Save You.\n\nIf You Get 21 Exactly You Get A Blackjack.\n\nA Blackjack Means You Automaticly Win Unless The Computer Gets A 21 And Ties You.\n\nBe Careful Not To Hit Too Many Times Because If You Go Over 21 You Lose That Hand.\n\nAny Face Card Is Automaticly A 10 At All Times.\n', color_pair(2))
    addstr('\n----------------------------------------------------------------------------------\n\n\n', color_pair(1) | A_BOLD)

    sleep(15)

    a = getch() #resets input variable

    while a == ord('q'): #Checks if input is q
        clear() #Clears before exit
        exit() #quits

while a == ord('y'): #Checks if input is y

    clear() #clears before displaying the next text

    addstr('\n\n\n\n\n----------------------------------------------------------------------------------', color_pair(1) | A_BOLD)
    addstr('\n\n\n\nGreat!\n\n\n\nHave Fun!\n\n\n\nGood Luck!\n\n\n', color_pair(2))
    addstr('----------------------------------------------------------------------------------\n\n\n', color_pair(1) | A_BOLD)

    refresh()

    time.sleep(1)

    b = '1'

    a = '' #resets input variable
我尝试用UTF-8对其进行编码,并通过执行chcp将命令提示符设置为UTF-8,然后当我运行该程序时,字符串将打印:

b'\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\x e2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x823 \xe2\x94\x82\n\xe2\x94\x82\t\xe2\x94\x82\n\xe2\x94\x82\t\xe2 \x94\x82\n\xe2\x94\x82\t\xe2\x94\x82\n\xe2\x94\x82\t\xe2\x94\x82\n\x e2\x94\x82\t\xe2\x94\x82\n\xe2\x94\x82\t\xe2\x94\x82\n\xe2\x94\x82 \t\xe2\x94\x82\n\xe2\x94\x82 3\xe2\x94\x82\n\xe2\x94\x94\x94\xe2\x94\x80\xe 2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\ x94\x80\xe2\x94\x80\xe2\x94\x98'

请帮助我按原样打印字符串,而不是使用unicode


如果您对我的代码有任何其他建议,请告诉我。

在Windows上,UniCourses使用ctypes进行包装。此库可以选择在项目站点上分发的32位DLL中使用Unicode支持构建。仅供参考,Unicode版本调用控制台范围内的字符API,如
WriteConsoleOutputW
,因此不必担心传统的控制台代码页。您需要“pdc34dllu.zip”构建,它采用UTF-8编码参数。由于预构建的DLL只有32位,因此必须使用32位Python,除非安装了Visual Studio 2015以构建64位DLL

您还必须对UniCourses进行一些更改才能使其正常工作。以下是我在32位Python 3.5中实现此功能所遵循的步骤:

  • 下载。将“pdcurses.dll”提取到Python的安装目录(即Python.exe所在的位置)或环境变量中的目录
  • 下载并摘录
  • 安装之前,请对unicurses.py进行以下更改。在第34行,将
    code=locale.getpreferredencoding()
    更改为
    code='utf-8'
    。接下来,注释掉第52-54行,如果不是os.access(“pdcurses.dll”,os.F_OK),则以
    开头。
    ,因为如果“pdcurses.dll”不在工作目录中,此检查将始终失败
  • 通过运行
    python setup.py Install
    安装程序包
  • 示例:打印卡片 输出
    ┌────────────┐
    │5.│
    │            │
    │            │
    │            │
    │            │
    │            │
    │            │
    │            │
    │           5.│
    └────────────┘
    
    源文件的编码是什么?您正在打印字节,生成它们的调试表示形式。先解码字节,你是最棒的!非常感谢你。我必须编辑你的代码,因为我想让多张卡挨着彼此,但它起作用了。谢谢@BrendanNeiman请不要在另一篇帖子上评论询问答案。
    mvaddstr(10, 10, '┌──────────┐\n│{}         │\n│           │\n│            │\n│            │\n│            │\n│            │\n│            │\n│            │\n│         {}│\n└──────────┘'.format(cards[0], cards[0]).encode('utf-8'))
    
    import unicurses
    
    card_template = '\n'.join([
        '┌────────────┐',
        '│{card}           │',
        '│            │',
        '│            │',
        '│            │',
        '│            │',
        '│            │',
        '│            │',
        '│            │',
        '│           {card}│',
        '└────────────┘'])
    
    def main():
        stdscr = unicurses.initscr()
        unicurses.clear()
        card_string = card_template.format(card=5)
        for i, line in enumerate(card_string.splitlines()):
            unicurses.mvaddstr(5 + i, 5, line)
        unicurses.refresh()
        unicurses.endwin()
    
    if __name__ == '__main__':
        main()