gpt4 book ai didi

python - 如何解决使用 Python 解码和打印希腊字符的困难?

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:21 25 4
gpt4 key购买 nike

我正在创建一个简单的游戏,旨在提示用户将英语单词翻译成希腊语。例如:

cow: # here, the gamer would answer with *η αγελάδα* in order to score one point.

我使用辅助函数从 txt 文件中读取和解码。我在所述函数中使用以下代码这样做:

# The variable filename refers to my helper function's sole parameter, it takes the 
# above mentioned txt file as an argument.
words_text = codecs.open(filename, 'r', 'utf-8')

此辅助函数然后读取每一行。这些行类似于这样的东西:

# 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的回答,发现前面的oject(ueff)是一个BOM签名(用来区分UTF-8和其他编码)。

这是一个小问题,我不确定如何以最整洁的方式将其删除。无论如何,我的辅助函数然后创建并返回一个看起来像这样的新字典:

{u'\u03b7 \u03b1\u03b3\u03b5\u03bb\u03ac\u03b4\u03b1': 'cow'}

然后,在我的主要功能中,我使用以下内容来存储用户的输入:

# 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

在回答与我类似的问题时,用户 ΤZΩΤZΙΟΥ 说要导入模块 unicodedata 并调用 normalize 方法(我在上面的代码中这样做),但我怀疑这可能没有必要。不幸的是,程序的这一步目前还没有关系,因为我在解码用户输入时遇到了问题。为了演示,当我 [使用内置的 repr()] 打印 user_reply 的规范字符串表示和字典中相应键的规范字符串表示时,我得到以下结果:

用户的输入(user_reply):

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>

请注意用户输入中的问号以及我在尝试正确打印希腊词时遇到的错误。这似乎是我问题的关键。

那么,我到底需要做什么才能解码用户的输入并正确显示所有希腊字符?

当使用我的 native 代码页时:

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 '? α?ε??δα'
? α?ε??δα
>>>

当使用希腊代码页时:(奇怪的是,只有当我先将它复制到剪贴板然后将其粘贴到文字类型的应用程序中时它才会正确显示。我会在默认控制台中发布它实际打印的图像,但是我缺乏这样做的声誉。)

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 'η αγελάδα'
η αγελάδα
>>>

UP:我必须将默认控制台的字体更改为 Lucida Console。这解决了我的差异。

最佳答案

对于您的部分问题,请使用:

words_text = codecs.open(filename, 'r', 'utf-8-sig')

它将处理\ufeff 的字节顺序标记。

从技术上讲,这是:

user_reply = raw_input('%s: ' % (gr_en_dict[key])).decode(sys.stdout.encoding)

应该是:

user_reply = raw_input('%s: ' % (gr_en_dict[key])).decode(sys.stdin.encoding)

但实际上它们应该是相同的编码。

我认为问题在于您的默认控制台中的编码不支持所有希腊字符。当我更改为希腊代码页时,事情开始变得更好。请注意,我可以将正确的字符粘贴到下面的 print 语句中,但 cp437 实际上并不支持所有字符,因此在打印时,不支持的字符将替换为问号:

C:\>chcp
Active code page: 437

C:\>python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> print 'η αγελάδα - cow'
? α?ε??δα - cow

如果我切换到希腊代码页(869 或 1253),它会起作用:

C:\>chcp 869
Active code page: 869

C:\>python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp869'
>>> print 'η αγελάδα - cow'
η αγελάδα - cow
>>>

关于python - 如何解决使用 Python 解码和打印希腊字符的困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com