2015-03-19 99 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