2015-03-19 79 views
0

我已经在python 2中编写了一个简单的脚本来训练我对平假名字母的了解。请参阅下面的代码:Python 3中的Unicode字符与Python 2

import random 

ROMAJI = ['A','I','U','E','O','KA','KI','KU','KE','KO','SA','SHI','SU','SE','SO','TA','CHI','TSU','TE','TO','NA','NI','NU','NE','NO'] 

romaji_letter = random.choice(ROMAJI) 
romaji_index = ROMAJI.index(romaji_letter) 

A = u'\u3042' 
I = u'\u3044' 
U = u'\u3046' 
E = u'\u3048' 
O = u'\u304A' 
KA = u'\u304B' 
KI = u'\u304D' 
KU = u'\u304F' 
KE = u'\u3051' 
KO = u'\u3053' 
SA = u'\u3055' 
SHI = u'\u3057' 
SU = u'\u3059' 
SE = u'\u305B' 
SO = u'\u305D' 
TA = u'\u305F' 
CHI = u'\u3061' 
TSU = u'\u3064' 
TE = u'\u3066' 
TO = u'\u3068' 
NA = u'\u306A' 
NI = u'\u306B' 
NU = u'\u306C' 
NE = u'\u306D' 
NO = u'\u306E' 

HIRAGANA = [A,I,U,E,O,KA,KI,KU,KE,KO,SA,SHI,SU,SE,SO,TA,CHI,TSU,TE,TO,NA,NI,NU,NE,NO] 

print("\nWhich Hiragana character is the Romaji letter " + romaji_letter + " ?\n") 

for letter in HIRAGANA: 
     print(letter.encode("UTF-8")+"  "+str(HIRAGANA.index(letter))+"\n") 


print("Choose the corresponding number and press [ENTER] : ") 

userInput = raw_input() 

try: 
     letter_index = int(userInput) 
     print("You have chosen letter "+HIRAGANA[letter_index].encode("UTF-8")) 

     if (letter_index == romaji_index): 
       print("The answer is correct!") 
     else: 
       print("The answer is incorrect!") 

except: 
     print("Enter only the number of the corresponding letters!") 

当我在python 2中执行它,它确实工作没有问题。但是,当我尝试使用python 3时,出现以下错误:

"Can't concat bytes to str" 

有人可以通过解释为什么会发生这种情况吗?

哦,如果不知道这非常重要,但我使用Windows 7上的Fedora和Python 3蟒蛇2(与Visual Studio 2012一起使用Python的工具)

+0

使用字典。 – 2015-03-19 10:56:58

回答

0

你不应该编码的字符,UTF -8。离开编码到print()电话:

for letter in HIRAGANA: 
    print(letter + u"  " + str(HIRAGANA.index(letter)) + u"\n") 

和:

print(u"You have chosen letter " + HIRAGANA[letter_index]) 

,因为在Python 3串都是Unicode值,不是字节的值,但编码总是产生字节。

更妙的是,使用字符串格式化和enumerate()这里:

for index, letter in enumerate(HIRAGANA): 
    print(u"{}  {}\n".format(letter, index)) 

print(u"You have chosen letter {}".format(HIRAGANA[letter_index])) 

接下来,raw_input()是不是在Python 3中使用,你必须使用input()那里。您可以使用例外来检测使用哪一个:

try: 
    raw_input 
except NameError: 
    raw_input = input # Python 3 
+0

工作正常!万分感谢! :)ありがとう! – sztyrymytyry 2015-03-19 11:12:26

+0

如果我可能会问,我还有一个问题给你,而这对我来说很奇怪。当我在python 3.4.2 shell中使用你的解决方案时,它的工作完美无瑕,但是当我在Visual Studio中使用它时,出现以下错误:'charmap'编解码器无法在位置0编码字符'\ u3042':字符映射到 。 Visual Studio的python工具的工作方式不同吗? – sztyrymytyry 2015-03-19 12:06:41

+0

@sztyrymytyry:Visual Studio中的控制台被配置为不同的代码页。除非重新配置它,否则它不能处理所有的Unicode输出。 – 2015-03-19 12:10:28