【问题标题】:Converting domain names to idn in python在python中将域名转换为idn
【发布时间】:2010-09-21 12:41:51
【问题描述】:

我有一长串域名需要生成一些报告。该列表包含一些 IDN 域,虽然我知道如何在命令行中在 python 中转换它们:

>>> domain = u"pfarmerü.com"
>>> domain
u'pfarmer\xfc.com'
>>> domain.encode("idna")
'xn--pfarmer-t2a.com'
>>> 

我正在努力让它与一个从文本文件读取数据的小脚本一起工作。

#!/usr/bin/python

import sys

infile = open(sys.argv[1])

for line in infile:
    print line,
    domain = unicode(line.strip())
    print type(domain)
    print "IDN:", domain.encode("idna")
    print

我得到以下输出:

$ ./idn.py ./test 
pfarmer.com
<type 'unicode'>
IDN: pfarmer.com

pfarmerü.com
Traceback (most recent call last):
  File "./idn.py", line 9, in <module>
    domain = unicode(line.strip())
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 7: ordinal not in range(128)

我也试过了:

#!/usr/bin/python

import sys
import codecs

infile = codecs.open(sys.argv[1], "r", "utf8")

for line in infile:
    print line,
    domain = line.strip()
    print type(domain)
    print "IDN:", domain.encode("idna")
    print

这给了我:

$ ./idn.py ./test       
Traceback (most recent call last):
  File "./idn.py", line 8, in <module>
    for line in infile:
  File "/usr/lib/python2.6/codecs.py", line 679, in next
    return self.reader.next()
  File "/usr/lib/python2.6/codecs.py", line 610, in next
    line = self.readline()
  File "/usr/lib/python2.6/codecs.py", line 525, in readline
    data = self.read(readsize, firstline=True)
  File "/usr/lib/python2.6/codecs.py", line 472, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-5: unsupported Unicode code range

这是我的测试数据文件:

pfarmer.com
pfarmerü.com

我非常清楚我现在需要了解 unicode。

谢谢,

彼得

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    您需要知道您的文件是以哪种编码保存的。这将类似于“utf-8”(不是 Unicode)或“iso-8859-1”或“cp1252”等。

    然后你可以这样做(假设'utf-8'):

    
    infile = open(sys.argv[1])
    
    for line in infile:
        print line,
        domain = line.strip().decode('utf-8')
        print type(domain)
        print "IDN:", domain.encode("idna")
        print
    

    使用decode 将编码字符串转换为Unicode。使用 encode 将 unicode 转换为字符串。如果您尝试对已经编码的内容进行编码,python 会首先尝试解码,默认编解码器“ascii”对于非 ASCII 值会失败。

    【讨论】:

    【解决方案2】:

    你的第一个例子很好,除了:

    domain = unicode(line.strip())
    

    您必须在此处指定特定编码:unicode(line.strip(), 'utf-8')。否则,您会得到默认编码,为了安全起见,它是 7 位 ASCII,因此会出现错误。或者,您可以将其拼写为line.strip().decode('utf-8'),如 knitti 的示例中所示;两种语法的行为没有区别。

    但是,从“无法解码字节 0xfc”的错误来看,我认为您实际上并没有将您的 test 文件保存为 UTF-8。大概这就是为什么第二个示例(原则上看起来还可以)失败的原因。

    取而代之的是 ISO-8859-1 或非常相似的 Windows 代码页 1252。如果它来自西方 Windows 机器上的文本编辑器,那肯定是后者;现在,Linux 机器默认使用 UTF-8。确保将文件保存为 UTF-8,或者改为使用编码 'cp1252' 读取文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多