Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将域名转换为idn_Python_Unicode - Fatal编程技术网

在python中将域名转换为idn

在python中将域名转换为idn,python,unicode,Python,Unicode,我有一个很长的域名列表,我需要生成一些报告。该列表包含一些IDN域,尽管我知道如何在命令行上用python转换它们: >>> domain = u"pfarmerü.com" >>> domain u'pfarmer\xfc.com' >>> domain.encode("idna") 'xn--pfarmer-t2a.com' >>> 我正在努力让它与从文本文件读取数据的小脚本一起工作 #!/usr/bin/pytho

我有一个很长的域名列表,我需要生成一些报告。该列表包含一些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)
这给了我:

$ ./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
我现在非常清楚我需要理解unicode

谢谢


Peter

您需要知道文件保存的编码。这可能类似于“utf-8”(不是Unicode)或“iso-8859-1”或“cp1252”或类似内容

然后您可以执行(假设为“utf-8”):


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

您需要知道文件保存的编码。这可能类似于“utf-8”(不是Unicode)或“iso-8859-1”或“cp1252”或类似内容

然后您可以执行(假设为“utf-8”):


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

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

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

然而,从错误“无法解码字节0xfc”判断,我认为您实际上没有将
测试
文件保存为UTF-8。这大概就是第二个例子失败的原因,这个例子在原则上看起来也不错


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

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

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

然而,从错误“无法解码字节0xfc”判断,我认为您实际上没有将
测试
文件保存为UTF-8。这大概就是第二个例子失败的原因,这个例子在原则上看起来也不错

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


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
domain = unicode(line.strip())