2009-06-12 7 views
8

मैं पाइथन 2.5 का उपयोग कर रहा हूं। यहाँ क्या हो रहा है? मैंने क्या गलत समझा है? मेरे द्वारा यह कैसे किया जा सकता है?पाइथन में यूटीएफ -8 समस्या अक्षर पढ़ने पर

in.txt:

Stäckövérfløw 

code.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
print """Content-Type: text/plain; charset="UTF-8"\n""" 
f = open('in.txt','r') 
for line in f: 
    print line 
    for i in line: 
     print i, 
f.close() 

उत्पादन:

Stäckövérfløw 

S t � � c k � � v � � r f l � � w 

उत्तर

14
for i in line: 
    print i, 

आप फ़ाइल पढ़ते हैं, स्ट्रिंग आप में पढ़े गए बाइट की एक श्रृंखला है। लूप के लिए एक समय में एक बाइट पर फिर से शुरू होता है। इससे यूटीएफ -8 एन्कोडेड स्ट्रिंग के साथ समस्याएं आती हैं, जहां गैर-ASCII वर्ण एकाधिक बाइट्स द्वारा दर्शाए जाते हैं। आप यूनिकोड वस्तुओं, जहां पात्रों बुनियादी टुकड़े कर रहे हैं के साथ काम करना चाहते हैं, आप

import codecs 
f = codecs.open('in', 'r', 'utf8') 

का उपयोग करना चाहिए sys.stdout पहले से ही उचित एन्कोडिंग सेट नहीं है, तो आप इसे रैप करने के लिए हो सकता है:

sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
+0

धन्यवाद, पर स्पॉट! – jacob

+3

'r' पैरामीटर 'codecs.open' में वास्तव में' आरबी '(नहीं' \ n 'रूपांतरण) है – jfs

1

चेक इस बाहर:

# -*- coding: utf-8 -*- 
import pprint 
f = open('unicode.txt','r') 
for line in f: 
    print line 
    pprint.pprint(line) 
    for i in line: 
     print i, 
f.close() 

यह इस रिटर्न:

Stackoverflow
'सेंट \ xc3 \ xa4ck \ xc3 \ xb6v \ xc3 \ xa9rfl \ xc3 \ xb8w'
एस टी? ? सी के? ? वी? ? आर एफ एल? ? डब्ल्यू

बात यह है कि फ़ाइल को केवल बाइट्स की स्ट्रिंग के रूप में पढ़ा जा रहा है। उन पर इटरेटिंग मल्टीबाइट वर्णों को गैर-विषैले बाइट मानों में विभाजित करता है।

+0

तक उपयोग कर सकते हैं काम नहीं होता! – jacob

2

इसके बजाय codecs.open का उपयोग करें, यह मेरे लिए काम करता है।

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
print """Content-Type: text/plain; charset="UTF-8"\n""" 
f = codecs.open('in','r','utf8') 
for line in f: 
    print line 
    for i in line: 
     print i, 
f.close() 
1
print c, 

एक "रिक्त charrecter" जोड़ता है और सही utf-8 अनुक्रम गलत में तोड़ता है। तो यह जब तक आप उत्पादन

sys.stdout.write(i) 
0

एक करने के लिए एक signle बाइट लिखना सिर्फ hurtig ब्लॉग सहायता के लिए

f = open('in.txt','r') 
for line in f: 
    print line 
    for i in line.decode('utf-8'): 
     print i, 
f.close() 
संबंधित मुद्दे