【发布时间】:2017-11-03 14:45:01
【问题描述】:
我正在使用 chatterbot 库开发一个聊天机器人。聊天机器人是我的母语 --> 斯洛文尼亚语,其中有很多奇怪的字符(例如:š、č、ž)。我正在使用 python 2.7。
当我尝试训练机器人时,库遇到了上述字符的问题。例如,当我运行以下代码时:
chatBot.set_trainer(ListTrainer)
chatBot.train([
"Koliko imam še dopusta?",
"Letos imate še 19 dni dopusta.",
])
它会抛出以下错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 12: invalid start byte
我在文件顶部添加了# -*- coding: utf-8 -*- 行,我还通过我的编辑器(Sublime text 3)将所有使用文件的编码更改为 utf-8,我使用以下代码更改了系统默认编码:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
字符串的类型是 unicode。
当我尝试使用这些奇怪的字符获得响应时,它可以工作,它们没有任何问题。例如,在与上述训练代码相同的执行过程中运行以下代码(当我在训练字符串中将 'š' 更改为 's' 并将 'č' 更改为 'c' 时),不会引发错误:
chatBot.set_trainer(ListTrainer)
chatBot.train([
"Koliko imam se dopusta?",
"Letos imate se 19 dni dopusta.",
])
chatBot.get_response("Koliko imam še dopusta?")
我找不到此问题的解决方案。有什么建议么? 提前感谢负载。 :)
编辑:我使用 from __future__ import unicode_literals 来制作 unicode 类型的字符串。我还使用 type(myString) 方法检查了它们是否真的是 unicode
我也想粘贴这个link。
编辑 2:@MallikarjunaraoKosuri - 的代码有效,但在我的情况下,我在聊天机器人实例初始化中还有一件事,如下所示:
chatBot = ChatBot(
'Test',
trainer='chatterbot.trainers.ListTrainer',
storage_adapter='chatterbot.storage.JsonFileStorageAdapter'
)
这是我的错误的原因。聊天机器人创建的 json 存储文件是用我的本地编码而不是 utf-8 创建的。似乎默认存储(.sqlite3)没有这个问题,所以现在我将避免使用 json 存储。但我仍然有兴趣找到解决此错误的方法。
【问题讨论】:
-
你说字符串是 unicode 类型的:你使用的是
from __future__ import unicode_literals吗?另外,哪一行会引发解码错误?因为如果字符串是 unicode,它们不应该被解码(它们都已经被解码),所以也不应该有任何解码错误。 -
不要更改默认编码。
setdefaultencoding因某种原因被禁用(库希望默认为ascii)。 -
#coding声明源文件的编码。确保以声明的编码实际保存源文件。 -
@lenz 是的,我正在使用
from __future__ import unicode_literals。解码错误在train("Koliko imam še dopusta?", "Letos imate še 19 dni dopusta.")方法中引发。 -
@MarkTolonen,好的,请注意,我将从我的代码中删除它。我在其他类似问题的stackoverflow回答中看到了这一点,并且在该线程中被标记为正确。我认为它被保存为 utf-8,我在 sublime 中做了那件事,下面的答案暗示了这一点。这就是我所说的“我还通过我的编辑器(Sublime text 3)将所有使用过的文件的编码更改为 utf-8”。但是我怎么知道在这样做之后我的文件实际上是 utf-8 编码?当我保存时,它会在程序页脚中写入一个状态,在文件的保存位置上,然后在括号中显示 utf-8。
标签: python-2.7 encoding utf-8 chatterbot