首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中将域名转换为idn

在python中将域名转换为idn
EN

Stack Overflow用户
提问于 2010-09-21 20:41:52
回答 2查看 13.2K关注 0票数 10

我有一个很长的域名名单,我需要生成一些报告。该列表包含一些IDN域,尽管我知道如何在命令行上将它们转换为python:

代码语言:javascript
复制
>>> domain = u"pfarmerü.com"
>>> domain
u'pfarmer\xfc.com'
>>> domain.encode("idna")
'xn--pfarmer-t2a.com'
>>> 

我正在努力让它使用一个从文本文件读取数据的小脚本。

代码语言:javascript
复制
#!/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

我得到以下输出:

代码语言:javascript
复制
$ ./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)

我也尝试过:

代码语言:javascript
复制
#!/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

这给了我:

代码语言:javascript
复制
$ ./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

下面是我的测试数据文件:

代码语言:javascript
复制
pfarmer.com
pfarmerü.com

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

谢谢,

彼得

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-21 20:47:30

你需要知道你的文件是用哪种编码保存的。这将是类似于'utf-8‘(不是Unicode)或'iso-8859-1’或'cp1252‘或类似的东西。

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

代码语言:javascript
复制
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值是失败的。

票数 21
EN

Stack Overflow用户

发布于 2010-09-21 22:17:57

您的第一个示例很好,只是:

代码语言:javascript
复制
domain = unicode(line.strip())

您必须在此处指定一个特定的编码:unicode(line.strip(), 'utf-8')。否则,您将得到默认编码,出于安全考虑,它是7位ASCII,因此会出现错误。或者,您可以将其拼写为line.strip().decode('utf-8'),就像在syntaxes的示例中一样;这两种语法之间的行为没有区别。

但是,根据错误“can‘t decode byte 0xfc”判断,我认为您实际上并没有将test文件保存为UTF-8。大概这就是第二个例子失败的原因,这个例子在原则上看起来也没问题。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3760338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档