2013-07-02 61 views
1

我在我的代碼做什麼:pygame的和Unicode - 一個永無止境的故事

月1日我打開一個UTF-8文本文件(是的,雙/三/四檢查:它是UTF-8),通過編解碼器的使用。打開...

def load_verbslist(folder, name, utf_encoding): 
    fullname = os.path.join("daten", folder, name) 
    if utf_encoding: 
     with codecs.open(fullname, "r", "utf-8-sig") as name: 
      lines = name.readlines() 
    else: 
     name = open(fullname, "r") 
     lines = name.readlines() 
    for x in range(0, len(lines)): 
     lines[x] = lines[x].strip("\n") 
     lines[x] = lines[x].strip("\r") 
    return lines 

從該文件中找到我的解決方案字符串。我後來分裂線,並再次編碼一切BitBlt到這樣的畫面:

class BlittedText(): 
    def __init__(self, number, colour): 
     self.number = number 
     self.colour = colour 
     if self.number == 0: #Infinitiv 
      self.content = Solution.verb[0] 
      self.content = self.content.encode("utf-8") 
      self.text = Main.font1.render(str(self.content), 1, self.colour) 
      self.pos = (45, 45) 

然後,我通過幾個那些BlittedText()類的附加一個名爲「弦」之列。

然後我再BitBlt到屏幕上:

for element in Strings: 
    screen.blit(element, position) 

結果可以在這張照片中可以看出: http://img341.imageshack.us/img341/6617/ee43.png 在Python殼(左側)都正確地顯示,我的投入(最左側)作爲來自解決方案TXT文件的字符串(當然,100%保存爲UTF-8)。在屏幕上我的輸入(黑色)正確,而解決方案字符串(綠色和紅色)顯示奇怪的字符,而不是unicode字符。我想,我正確編碼他們,但顯然不是:/

有沒有人發現我的錯誤?我的思維在哪裏出錯了?

非常感謝你!

帕特

回答

2

你不應該渲染前的字符串編碼爲utf-8。 當你將它編碼爲utf-8時,你正在生成一個具有奇怪字符的常規字符串。

如果你把它編碼爲Latin-1的你擺脫奇怪的字符:

self.content = self.content.encode("iso-8859-1") 
+0

我也這麼認爲,但如果我不這麼做我得到「UnicodeEncodeError:‘ASCII’編解碼器不能編碼字符u'\ xe9'在位置11:序號不在範圍(128)「錯誤:/ –

+0

可能render()方法正在編碼爲標準ascii產生錯誤。我認爲你應該把它編碼爲「iso-8859-1」(拉丁-1),而不是utf-8,這樣你就可以擺脫奇怪的字符,並獲得對整個latin-1字符集的支持。我希望你的所有角色都是拉丁語-1。 – pmoleri

+0

謝謝!這很有效,而且看起來這些角色真的都是拉丁語-1。它對我來說仍然沒有意義,因爲我的輸入也是用UTF-8編碼的,並且包含了非常相同的字符 - 而且它們完全沒有問題...... –