首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unicode Python Windows控制台

Unicode Python Windows控制台
EN

Stack Overflow用户
提问于 2016-08-07 22:19:27
回答 1查看 248关注 0票数 1

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

代码语言:javascript
复制
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

以下是我对此有异议的一句话:

代码语言:javascript
复制
mvaddstr(10, 10, '┌──────────┐\n│{}         │\n│           │\n│            │\n│            │\n│            │\n│            │\n│            │\n│            │\n│         {}│\n└──────────┘'.format(cards[0], cards[0]).encode('utf-8'))

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

b'\xe2\x94\x8c\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_x_2\x_2\x_2\x_(94)\x_2 \t \x_2\x 94\x_2\x_2\x 94\x_2 \t \X_2\x 94\x_2\x 94\x 82\x E_2\x 94\x82\x E_2\x 94\x_x 94\x 82\x E_2\x 94\x_2\x 94\X_2\x 94\x 94\x_xT\xE2\x94\x82\n\xE2\x82 3\xE2\x94\xE2\x94\xE2\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\x80\xE2\x94\x94\x98‘

请帮我打印字符串,它应该是,而不是在unicode。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-08 02:40:05

在Windows上,独角兽使用ctype包装PDCurses。此库可选地在项目站点上分布的32位DLL中使用Unicode支持构建。Unicode版本调用控制台宽字符API(如WriteConsoleOutputW ),所以不要担心遗留的控制台代码页。您需要"pdc34dllu.zip“构建,它接受UTF-8编码的参数。因为预构建的DLL只有32位,所以必须使用32位Python,除非安装了Visual 2015来构建64位DLL。

您还必须对独角兽进行一些更改才能完成这项工作。下面是我在32位Python3.5中实现这个功能所遵循的步骤:

  1. 下载pdc34dllu.zip。将"pdcurses.dll“解压到Python的安装目录(即python.exe所在的位置)或PATH环境变量中的目录中。
  2. 下载并解压UniCurses-1.2.zip
  3. 在安装之前,对unicurses.py进行以下更改。在第34行,将code = locale.getpreferredencoding()更改为code = 'utf-8'。接下来,注释掉以if not os.access("pdcurses.dll",os.F_OK)开头的第52-54行,因为如果"pdcurses.dll“不在工作目录中,则此检查将始终失败。
  4. 通过运行python setup.py install安装包。

例如:打印卡片

代码语言:javascript
复制
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()

输出

代码语言:javascript
复制
     ┌────────────┐
     │5           │
     │            │
     │            │
     │            │
     │            │
     │            │
     │            │
     │            │
     │           5│
     └────────────┘
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38819079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档