我正在创建一个简单的游戏,旨在提示用户一个英语单词的希腊翻译。例如:
cow: # here, the gamer would answer with *η αγελάδα* in order to score one point.
从一个帮助文件中读取和解码的函数。我在上述函数中使用了以下代码:
^{pr2}$这个helper函数然后读取每一行。这些线条类似于:
# In stack data, when I debug, it reads as u"\η αγελάδα - cow\r\n".
u"\u03b7 \u03b1\u03b3\u03b5\u03bb\u03ac\u03b4\u03b1 - cow\r\n"
但是,文件读取时的第一行有一个不需要的前缀ueff-:
# u"\ufeffη αγελάδα - cow\r\n"
u"\ufeff\u03b7 \u03b1\u03b3\u03b5\u03bb\u03ac\u03b4\u03b1 - cow\r\n"
注意:在查看了Mark的答案后,我发现preprepended project(ueff)是一个BOM签名(用于区分UTF-8和其他编码)。在
这是一个小问题,我不知道如何以最整洁的方式将其删除。无论如何,我的helper函数会创建并返回一个新的字典,如下所示:
{u'\u03b7 \u03b1\u03b3\u03b5\u03bb\u03ac\u03b4\u03b1': 'cow'}
然后,在main函数中,我使用以下命令来存储用户的输入:
# This is the code for the prompt I noted at the beginning.
# The variable gr_en_dict is the dictionary noted right above.
for key in gr_en_dict:
user_reply = raw_input('%s: ' % (gr_en_dict[key])).decode(sys.stdout.encoding)
然后,我将用户输入的值与字典中相应的键进行比较:
# I imported unicodedata as ud.
if ud.normalize('NFC', user_reply) == ud.normalize('NFC', key):
score += 1
在回答一个类似于我的问题时,用户ΖΩΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖ。不幸的是,我对程序的输入没有问题。为了演示,当我打印user_reply的规范字符串表示和字典中相应键的规范字符串表示形式时[使用内置的repr()],我得到以下结果:
用户输入(用户答复):
u'? \u03b1?\u03b5??\u03b4\u03b1'
如果不使用repr()函数打印用户的输入,则如下所示:
? α?ε??δα
在我的字典中输入:
u'\u03b7 \u03b1\u03b3\u03b5\u03bb\u03ac\u03b4\u03b1'
如果不使用repr()打印,则会出现错误:
UnicodeEncodeError: 'charmap' codec can't encode character u'\u03b7' in position 0: character maps to <undefined>
注意用户输入中的问号,以及当我试图正确地打印希腊单词时出现的错误。这似乎是我问题的症结所在。在
那么,为了解码用户的输入并正确显示所有希腊字符,我到底需要做些什么?
使用本机代码页时:
C:\>chcp
Active code page: 437
C:\>\python25\python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> print '? α?ε??δα'
? α?ε??δα
>>>
使用希腊语代码页时:(奇怪的是,只有当我先将其复制到剪贴板,然后将其粘贴到word类型的应用程序中时,它才会正确显示。我会在默认控制台上发布它实际打印的图像,但我并没有这样做的声誉。)
C:\>chcp 869
Active code page: 869
C:\>\python25\python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp869'
>>> print ' η αγελάδα'
η αγελάδα
>>> print 'η αγελάδα'
η αγελάδα
>>>
向上:我不得不将默认控制台的字体改为Lucida控制台。这解决了我的矛盾。在
对于部分问题,请使用:
它将处理\ufeff的字节顺序标记。在
从技术上讲,这:
^{pr2}$应该是:
但实际上它们应该是相同的编码。在
我认为问题是默认控制台中的编码不支持所有希腊字符。当我切换到希腊代码页时,事情开始好转。请注意,我可以将正确的字符粘贴到下面的
print
语句中,但cp437实际上并不支持所有字符,因此在打印时,不支持的字符将替换为问号:如果我切换到希腊代码页(869或1253),它可以工作:
标准windows shell存在扩展字符问题。我建议使用类似Windows PowerShell的东西。在
对于'\ufeff'字符(字节顺序标记),您可以在读入文件后执行以下检查:
那样的话,如果它在那里,你就把它扔掉了。在
相关问题 更多 >
编程相关推荐