मेरे पास डोमेन नामों की एक लंबी सूची है, जिन पर मुझे कुछ रिपोर्टें तैयार करनी होंगी। सूची में कुछ IDN डोमेन हैं, और यद्यपि मैं जानता हूं कि उन्हें कमांड लाइन पर अजगर में कैसे परिवर्तित किया जाए:
>>> domain = u"pfarmerü.com"
>>> domain
u"pfarmerxfc.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
मुझे अब यूनिकोड को समझने की मेरी आवश्यकता के बारे में पता है।
धन्यवाद,
पीटर
उत्तर:
उत्तर № 1 के लिए 13आपको यह जानने की जरूरत है कि आपने किस एन्कोडिंग में फाइल सेव की थी। यह "utf-8" (जो यूनिकोड नहीं है) या "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
। यूनिकोड को स्ट्रिंग में बदलें encode
। यदि आप किसी ऐसी चीज़ को एनकोड करने की कोशिश करते हैं जो पहले से ही एनकोडेड है, तो पहले पायदान पर डिकोड करने की कोशिश करता है, डिफ़ॉल्ट कोडेक "अस्की" के साथ जो गैर-एएससीआईआई-मानों के लिए विफल रहता है।
जवाब के लिए 2 № 2
आपका पहला उदाहरण ठीक है, सिवाय इसके कि:
domain = unicode(line.strip())
आपको यहां एक विशेष एन्कोडिंग निर्दिष्ट करना होगा: unicode(line.strip(), "utf-8")
। अन्यथा आपको डिफ़ॉल्ट एन्कोडिंग मिलती है जो सुरक्षा के लिए 7-बिट ASCII है, इसलिए त्रुटि। वैकल्पिक रूप से आप इसे वर्तनी दे सकते हैं line.strip().decode("utf-8")
जैसा कि नाइटी के उदाहरण में, दो वाक्यविन्यासों के बीच व्यवहार में कोई अंतर नहीं है।
हालाँकि, त्रुटि "टी डिकोड बाइट 0xfc" को देखते हुए, मुझे लगता है कि आप वास्तव में अपने को बचा नहीं सकते हैं test
utf-8 के रूप में फ़ाइल करें। संभवत: यही कारण है कि दूसरा उदाहरण, यह भी सिद्धांत रूप में ठीक दिखता है, विफल।
इसके बजाय यह ISO-8859-1 या बहुत समान हैविंडोज कोड पेज 1252. यदि यह पश्चिमी विंडोज बॉक्स पर एक टेक्स्ट एडिटर से आता है, तो यह निश्चित रूप से बाद वाला होगा; लिनक्स मशीनें आजकल डिफ़ॉल्ट रूप से utf-8 का उपयोग करती हैं। या तो अपनी फाइल को utf-8 के रूप में सहेजना सुनिश्चित करें, या एन्कोडिंग का उपयोग करके फ़ाइल पढ़ें "cp1252"
बजाय।