Python中的国际字符

Python中的国际字符,python,encoding,utf-8,Python,Encoding,Utf 8,我目前正在编写一个Python脚本,该脚本获取一个日志文件列表(来自搜索引擎),并生成一个包含这些日志文件中所有查询的文件,供以后分析。 这个脚本的另一个特点是,它删除了我也实现过的最常用的单词,但我遇到了一个似乎无法克服的问题。只要查询不包含特殊字符,就可以按预期删除单词。由于搜索日志使用丹麦语,字符æ、ø和å将定期出现 在搜索主题时,我现在意识到我需要将它们编码为UTF-8,这是我在获取查询时所做的: tmp = t_query.encode("UTF-8").lower().split()

我目前正在编写一个Python脚本,该脚本获取一个日志文件列表(来自搜索引擎),并生成一个包含这些日志文件中所有查询的文件,供以后分析。 这个脚本的另一个特点是,它删除了我也实现过的最常用的单词,但我遇到了一个似乎无法克服的问题。只要查询不包含特殊字符,就可以按预期删除单词。由于搜索日志使用丹麦语,字符æ、ø和å将定期出现

在搜索主题时,我现在意识到我需要将它们编码为UTF-8,这是我在获取查询时所做的:

tmp = t_query.encode("UTF-8").lower().split()
t_query是一个查询,我将其拆分,以便稍后将每个单词与我的禁用单词列表进行比较。如果我不使用编码,我将得到错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 1: ordinal not in range(128)
编辑:我也尝试使用解码,但出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa7' in position 3: ordinal not in range(128)
我循环使用这样的词:

for i in tmp:
    if i in words_to_filter:
        tmp.remove(i)
如前所述,这适用于不包含特殊字符的单词。我已尝试打印I和当前禁止的单词,并将获得例如:

færdelsloven - færdelsloven
其中,第一个单词是tmp中的第i个元素。最后一个字来自禁语。显然出了点问题,但我就是找不到解决办法。我尝试了很多在谷歌和这里找到的建议,但到目前为止没有任何效果

编辑2:如果有区别,我已经尝试过加载日志文件,无论是否使用编解码器:

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())
如果有必要的话,我正在Windows环境中运行Python 2.7.2。该脚本应该能够在其他平台(即Linux和Mac OS)上运行

如果你们中有人能帮助我,我将不胜感激

致意
Casper

如果您正在读取文件,则需要对其进行
解码

tmp = t_query.decode("UTF-8").lower().split()

给定每行包含json对象的utf-8文件,您可以读取所有对象:

with open(filename) as file:
    jlogs = [json.loads(line) for line in file]
除嵌入换行符处理外,上述代码应产生与您相同的结果:

with codecs.open(file_name, "r", "utf-8") as f_src:
    jlogs = map(json.loads, f_src.readlines())
此时,
jlogs
中的所有字符串都是Unicode,您不需要做任何事情来处理“特殊”字符。只需确保代码中没有混合字节和Unicode文本

  • 要从字节中获取Unicode文本:
    一些字节。解码(字符编码)
  • 要从Unicode文本中获取字节:
    some\u text.encode(字符编码)

不要对字节进行编码/对Unicode进行解码。

如果编码正确,并且只想忽略意外字符,则可以使用传递给
编解码器的
errors='ignore'
errors='replace'
参数。打开
函数

with codecs.open(file_name, encoding='utf-8', mode='r', errors='ignore') as f:
    jlogs = map(json.loads, f.readlines())
文档中的详细信息:
我终于解决了这个问题。正如Lattyware一样,Python3.x似乎做得更好。更改版本并将Python文件编码为Unicode后,它将按预期工作。

请注意,如果您经常使用Unicode,如果可能的话,你可能想使用3.x,因为它的Unicode支持要好得多。请阅读以下内容:-你显然对编码知之甚少甚至几乎一无所知…你也可以阅读Joel Spolsky的文章。没有理由粗鲁。我以前浏览过那一页,但没有找到对我有帮助的。如果你能很好地指出你认为什么能帮助我解决我的问题,那将是值得赞赏的。对于@ ToMaskI我认为我自己有编码的基本知识-远不是专家。这就是为什么我觉得这个问题很奇怪,因为在我的头脑中,它应该不难解决。我刚才忽略了/误解了一些事情。这就是为什么我请你们帮忙:)在输入端解码,在内部使用unicode,在输出端编码。对不起,我忘了提到我已经试过了,但我认为这是错误的,因为我收到了一条错误消息:UnicodeEncodeError:“ascii”编解码器无法在位置3对字符u'\xa7'进行编码:序号不在范围内(128)