什么是unicode中的%2

时间:2014-07-10 10:59:09

标签: python unicode

我正在读别人,并谈到有关unicode的部分,这对我来说总是很头疼。如果你能提供一些提示,这将真的有很大的帮助。

情况如此: 我有一个名为stopword.txt的禁用文件,其格式如下:

         1   781037 
         2   650706 damen
         3   196100 löwe
         4   146044 lego
         5   138280 monster
         6   136410 high
         7   100657 kost%c3%bcm   #this % seems to be strange already
         8    94084 schuhe
         9    93680 kinder
         10   87308 mit

和尝试阅读的代码,看起来像:

     with open('%s/%s'%('path_to_stopwords.txt'), 'r') as f:
          stoplines = [line.decode('utf-8').strip() for line in f.readlines()]

这个解码('utf-8')对我来说似乎很神秘。正如我的理解,没有额外的 规范“open”方法将文件读入字符串,将自动编码为 ascii(所以在这种情况下,如果打开的文件包含代码点在128之外的字符,就像löwe一样,它会被读入带有编码ascii的程序,因为那么ö会被截断编码吗?)在读入程序后尝试将其解码为utf-8?

为了验证我的想法,我尝试使用代码检查每行中的内容。

    for line in stoplines:
        print line

给了我:

    %09
    %21%21%21
    %26
    %26amp%3b
    %28buch%29
    %28gr.
    %2b
    %2bbarbie

我很困惑这些%来自哪里。我是否在文件的上下文中正确阅读了?

非常感谢你

2 个答案:

答案 0 :(得分:2)

在Python 2中,当你打开一个文件并从中读取时,你得到一个str实例,而不是unicode字符串(在Python 3中,你得到一个str },这是Python 3中的unicode。

str.decode('utf-8')可让您将str解码为unicode字符串(假设编码为UTF8!)。

您的停用词似乎是URL-encoded

print urllib.unquote('%c3%bc')
ü

如果文件应该是UTF8(本身支持ü等字符),那么使用urlencoding确实是多余的,但我的直觉是这个文件实际上是ASCII,而不是UTF8。

所有ASCII字符都映射到UTF8中的相同字符,因此尽管有错误,但这仍然有效。

答案 1 :(得分:1)

几点:

  1. 如果文件是UTF-8,您应该将其所有打开为UTF-8,而不是逐行打开。读取全部然后解码(即f.read()。decode(“utf-8”))或使用带有UTF-8的codecs.open打开它。
  2. 你不需要f.readlines(),你可以简单地做“for line in f”。它的内存效率更高,更短。
  3. '%s /%s'%('path_to_stopwords.txt')甚至不起作用。确保你正确地做到了。您可能希望使用os.path.join来加入路径。
  4. %encoding是url编码。正如Thomas上面写的那样,你可以使用urllib.unquote。
相关问题