2013-05-08 96 views
2

我在想如何在Python 2.7中對字典進行編碼。當我做到以下幾點:Python 2.7 Unicode字典

# coding=ISO-8859-1 
Programmer = {'v': ["1","2x","3","4","5"]} 
Programmer.update({'x': ["1","2x","3","4","5"]}) 
Programmer.update({'y': ["1","2x","3","4","5"]}) 
Programmer.update({'z': ["1","2x","3","4","5"]}) 
Programmer.update({'æ': ["1","2x","3","4","5"]}) 
Programmer.update({'ø': ["1","2x","3","4","5"]}) 
Programmer.update({'å': ["1","2x","3","4","5"]}) 
print Programmer 

我得到:

{'v': ['1', '2x', '3', '4', '5'], '\xe5': ['1', '2x', '3', '4', '5'], '\xf8': ['1', '2x', '3', '4', '5'], '\xe6': ['1', '2x', '3', '4', '5'], 'y': ['1', '2x', '3', '4', '5'], 'x': ['1', '2x', '3', '4', '5'], 'z': ['1', '2x', '3', '4', '5']} 

而我想要的是:

{'v': ['1', '2x', '3', '4', '5'], 'å': ['1', '2x', '3', '4', '5'], 'ø': ['1', '2x', '3', '4', '5'], 'æ': ['1', '2x', '3', '4', '5'], 'y': ['1', '2x', '3', '4', '5'], 'x': ['1', '2x', '3', '4', '5'], 'z': ['1', '2x', '3', '4', '5']} 

編輯:

這是我工作的代碼:

# -*- coding: cp1252 -*- 
from PyQt4 import QtCore, QtGui 
import locale 

global Programmer 
Programmer = {u'v': ["1","2x","3","4","5"]} 
Programmer.update({u'x': ["1","2x","3","4","5"]}) 
Programmer.update({u'y': ["1","2x","3","4","5"]}) 
Programmer.update({u'z': ["1","2x","3","4","5"]}) 
Programmer.update({u'æ': ["1","2x","3","4","5"]}) 
Programmer.update({u'ø': ["1","2x","3","4","5"]}) 
Programmer.update({u'å': ["1","2x","3","4","5"]}) 

class Dialog(QtGui.QDialog): 
    NumGridRows = 3 
    NumButtons = 3 

    def __init__(self): 
     super(Dialog, self).__init__() 
     styleComboBox = QtGui.QComboBox() 
     styleComboBox.addItem("UI Item01") 
     styleLabel = QtGui.QLabel("&UI Text:") 
     styleLabel.setBuddy(styleComboBox) 
     opgaveComboBox = QtGui.QComboBox() 
     opgaveComboBox.addItem(u"v") 
     opgaveComboBox.addItem(u"x") 
     opgaveComboBox.addItem(u"å") 

     opgaveLabel = QtGui.QLabel("&Opgave:") 
     opgaveLabel.setBuddy(opgaveComboBox) 

     self.programComboBox = QtGui.QComboBox() 
     self.programComboBox.addItem("UI item02") 
     programLabel = QtGui.QLabel("&Program:") 
     programLabel.setBuddy(self.programComboBox) 


     opgaveComboBox.activated[str].connect(self.changeOpgave) 

     topLayout = QtGui.QHBoxLayout() 
     topLayout.addWidget(styleLabel) 
     topLayout.addWidget(styleComboBox) 
     #topLayout.addStretch(1) 

     topLayoutB = QtGui.QHBoxLayout() 
     topLayoutB.addWidget(opgaveLabel) 
     topLayoutB.addWidget(opgaveComboBox) 
     #topLayoutB.addStretch(1) 

     topLayoutC = QtGui.QHBoxLayout() 
     topLayoutC.addWidget(programLabel) 
     topLayoutC.addWidget(self.programComboBox) 



     mainLayout = QtGui.QGridLayout() 
     mainLayout.addLayout(topLayout, 0, 0, 1, 2) 
     mainLayout.addLayout(topLayoutB, 1, 0, 1, 2) 
     mainLayout.addLayout(topLayoutC, 2, 0, 1, 2) 
     mainLayout.setRowStretch(1, 1) 
     mainLayout.setRowStretch(2, 1) 
     mainLayout.setColumnStretch(0, 1) 
     mainLayout.setColumnStretch(1, 1) 
     self.setLayout(mainLayout) 



     self.changeStyle('Cleanlooks') 
     self.setWindowTitle("temp test") 

    def changeOpgave(self, opgaveName): 
     self.programComboBox.clear() 
     print "begin 01" 
     print Programmer[opgaveName] 

     if not opgaveName in Programmer: 
      print "begin 02" 
      self.programComboBox.addItem("Andet") 
     else: 
      print "go" 
      for item in Programmer[opgaveName]: 
       self.programComboBox.addItem(item) 

    def changeStyle(self, styleName): 
     QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styleName)) 
     self.changePalette() 

    def changePalette(self): 
     QtGui.QApplication.setPalette(QtGui.QApplication.style().standardPalette()) 

if __name__ == '__main__': 

    import sys 

    app = QtGui.QApplication(sys.argv) 
    dialog = Dialog() 
    dialog.show() 
    sys.exit(dialog.exec_()) 

我得到

KeyError: PyQt4.QtCore.QString(u'v') 
KeyError: PyQt4.QtCore.QString(u'x') 
KeyError: "PyQt4.QtCore.QString(u'\xe5') 

當試圖從 「opgave」 列表

+1

你需要閱讀[Python Unicode HOWTO](http://docs.python.org/2/howto/unicode.html),我會說。另外,Python打印字符串作爲表示,其中非ASCII和不可打印字符由轉義序列表示。 *值*沒有改變。 – 2013-05-08 09:46:29

+0

是的,沒有讀過那個,但我想我完全不理解它。問題是當我後來在我的代碼開始比較它與「if」語句我得到的關鍵錯誤「KeyError:u'\ xc5'」 – user2339945 2013-05-08 10:36:31

+0

然後,某些* else *在這一點上是錯誤的。你的例子中的字典不包含字符''\ xc5',所以這並不奇怪。 – 2013-05-08 10:41:11

回答

1

ComboBox回調函數是一個PyQt4.QtCore.QString()對象,而不是一個unicode字符串。另一方面,您的字典應該使用unicode()鍵(這是正確的做法)。

轉換的QString()對象爲Unicode值第一:

def changeOpgave(self, opgaveName): 
    opgaveName = unicode(opgaveName) 

這工作,因爲QString()對象已持有的Unicode數據,並提供用Python的右勾拳進行這種轉換,而無需重新編碼數據用一個明確的編解碼器。

一旦opgaveName值是一個unicode密鑰,您可以使用它來與您的字典進行比較。

請注意,你可以定義詞典不.update()電話:

Programmer = { 
    u'v': ["1","2x","3","4","5"], 
    u'x': ["1","2x","3","4","5"], 
    u'y': ["1","2x","3","4","5"], 
    u'z': ["1","2x","3","4","5"], 
    u'æ': ["1","2x","3","4","5"], 
    u'ø': ["1","2x","3","4","5"], 
    u'å': ["1","2x","3","4","5"], 
} 

global關鍵字已經沒有意義了,你正在使用它;該關鍵字只在函數內部有意義,在這裏是多餘的。

+0

你我的朋友,是最棒的!它現在非常有意義。 – user2339945 2013-05-08 12:02:32

0

(誤差在線路79扔)選擇可能是這樣的:

print "{", 
for key, value in Programmer.items(): 
    print "'%s'" % key, ':', value, ',', 
print "}" 

當你打印然後這將打印str(Programmers)但內部字典使用repr(key)repr(value)。內容不會改變,只會以不同的方式打印。

+0

啊......好的!謝謝。但正如在我對Martijn的回答中所述,當比較值「KeyError:u'\ xc5'」時,我得到了一些錯誤「 – user2339945 2013-05-08 10:37:36

+0

編碼是我不確定的,因此我總是使用'#coding = UTF- 8'和'unicode'字符串與'u'''不會進入不同編碼文件的地獄。 – User 2013-05-08 10:45:12