2011-04-04 11 views
6

के साथ यूटीएफ -8 त्रुटि मैं अपने संपादक में यूटीएफ -8 का उपयोग करता हूं, इसलिए यहां प्रदर्शित सभी स्ट्रिंग्स यूटीएफ -8 फाइल में हैं।पाइथन और गेटटेक्स्ट

# -*- coding: utf-8 -*- 
... 
parser = optparse.OptionParser(
    description=_('automates the dice rolling in the classic game "risk"'), 
    usage=_("usage: %prog attacking defending")) 

तब मैं xgettext इस्तेमाल किया सब कुछ बाहर निकलने के लिए और एक पॉट फाइल जो करने के लिए नीचे उबला हुआ जा सकता है मिल गया:

मैं इस तरह एक अजगर स्क्रिप्ट है

"Content-Type: text/plain; charset=CHARSET\n" 
"Content-Transfer-Encoding: 8bit\n" 

#: auto_dice.py:16 
msgid "automates the dice rolling in the classic game \"risk\"" 
msgstr "" 

उसके बाद,

"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 

#: auto_dice.py:16 
msgid "automates the dice rolling in the classic game \"risk\"" 
msgstr "automatisiert das Würfeln bei \"Risiko\"" 

चल रहा है: मैं एक de.po जो मैं इस तरह में भर पाने के लिए इस्तेमाल किया msginit स्क्रिप्ट, मुझे निम्न त्रुटि मिलती है:

File "/usr/lib/python2.6/optparse.py", line 1664, in print_help 
    file.write(self.format_help().encode(encoding, "replace")) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 60: ordinal not in range(128) 

मैं इसे कैसे ठीक कर सकता हूं?

+0

की '_ (प्रकार क्या है।" उपयोग:% prog बचाव पर हमला ")'? यानी 'प्रिंट प्रकार (_ ("उपयोग:% प्रॉग हमलावर हमलावर" क्या करता है)' प्रिंट? – Mikel

उत्तर

6

कि त्रुटि, मतलब है कि आप एक bytestring पर एनकोड बुलाया गया है तो यह यह यूनिकोड (अजगर 2 पर ascii) सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग तो यह जो कुछ भी आप के साथ डिकोड करने के लिए, फिर से एनकोड की कोशिश करता है निर्दिष्ट है ईडी।

आम तौर पर, इसे सुलझाने के लिए जिस तरह से s.decode('utf-8') कॉल करने के लिए है (या जो भी एन्कोडिंग तार में हैं) तार का उपयोग करने के प्रयास करने से पहले। यह भी काम कर सकता है यदि आप सिर्फ यूनिकोड अक्षर का उपयोग करते हैं: u'automates...' (यह इस बात पर निर्भर करता है कि तारों को .po फ़ाइलों से कैसे प्रतिस्थापित किया जाता है, जिन्हें मैं नहीं जानता)।

इस तरह के भ्रमित व्यवहार को पायथन 3 में सुधार किया गया है, जो बाइट्स को यूनिकोड में परिवर्तित करने की कोशिश नहीं करेगा जबतक कि आप इसे विशेष रूप से नहीं बताते।

+0

'यू' शाब्दिक "काम नहीं करता है, लेकिन' डीकोड ("utf-8") 'काम करता है। बहुत अच्छा नहीं है, लेकिन काम करता है। –

2

मैं इस से परिचित नहीं हूँ, लेकिन यह 2.6 में एक ज्ञात बग है कि 2.7 में निर्धारित किया गया है प्रतीत होता है: यदि यह संभव नहीं है कि आप 2.7 उपयोग करने के लिए, इस समाधान की कोशिश

http://bugs.python.org/issue2931

:

http://mail.python.org/pipermail/python-dev/2006-May/065458.html

4

मेरे संदेह है कि समस्या एक बाइट स्ट्रिंग और नहीं एक यूनिकोड स्ट्रिंग लौटने _("string") के कारण होता है।

parser = optparse.OptionParser(
     description=_('automates the dice rolling in the classic game "risk"').decode('utf-8'), 
     usage=_("usage: %prog attacking defending").decode('utf-8')) 

लेकिन वह गलत लगता है:

स्पष्ट वैकल्पिक हल यह है।

ugettext या install(True) मदद कर सकता है।

import gettext 
t = gettext.translation('spam', '/usr/share/locale') 
_ = t.ugettext 

या:

import gettext 
gettext.install('myapplication', '/usr/share/locale', unicode=1) 

मैं आपकी समस्या को पुन: पेश करने की कोशिश कर रहा हूँ, और यहां तक ​​कि अगर मैं install(unicode=1) उपयोग करते हैं, मैं वापस एक बाइट स्ट्रिंग प्राप्त

Python gettext docs इन उदाहरणों देना (str प्रकार)।

या तो मैं गलत तरीके से gettext उपयोग कर रहा हूँ, या मैं एक चरित्र मेरी .po/.mo फ़ाइल में घोषणा कोडिंग याद आ रही है।

जब मैं और जानूं तो मैं अपडेट करूंगा।

xlt = _('automates the dice rolling in the classic game "risk"') 
print type(xlt) 
if isinstance(xlt, str): 
    print 'gettext returned a str (wrong)' 
    print xlt 
    print xlt.decode('utf-8').encode('utf-8') 
elif isinstance(xlt, unicode): 
    print 'gettext returned a unicode (right)' 
    print xlt.encode('utf-8') 

(एक अन्य संभावना पुलिस फाइल में पलायन या यूनिकोड कोड अंक उपयोग करने के लिए है, लेकिन यह मज़ा की तरह ध्वनि नहीं है।)

(या आप अपने सिस्टम के .po करने के लिए फ़ाइलों को देखो सकता है कैसे वे गैर- ASCII वर्ण संभाल देखें)

संबंधित मुद्दे