2011-06-02 12 views
8

विभिन्न कारणों से मुझे एक विरासत स्क्रिप्ट से त्रुटि संदेश Malformed UTF-8 character और Wide character in print मिल रहा है।मैं पर्ल में यूटीएफ -8 चेतावनियों को कैसे दबा सकता हूं?

मैं उन दो चेतावनियों को दबाने/अक्षम करना चाहता हूं ताकि वे STDERR पर लिखे जाएं।

मैं यह कैसे कर सकता हूं?

उत्तर

6
no warnings 'utf8'; 

लेकिन यह पता लगाना सबसे अच्छा है कि आपको चेतावनी क्यों मिल रही है और अंतर्निहित समस्या को ठीक कर रहा है। उन दो चेतावनियों से संकेत मिलता है कि आपकी लिपि में कुछ गलत हो रहा है। चेतावनियों को दबाने से त्रुटि ठीक नहीं होगी।

5

यहाँ आप त्रुटियों को समझने में मदद करने के लिए दो उदाहरण है:

[email protected]: ~/Milu/Dev/Perl > cat malformed-utf8-char.pl 
use utf8; # script source must be in UTF-8 
use strict; 
use warnings; 
print "K�se\n"; 
[email protected]: ~/Milu/Dev/Perl > perl malformed-utf8-char.pl 
Malformed UTF-8 character (unexpected non-continuation byte 0x73, 
immediately after start byte 0xe4) at malformed-utf8-char.pl line 4. 
Kse 

स्रोत लैटिन -1 में है, मेरी टर्मिनल UTF-8 में है। स्ट्रिंग वास्तव में "कास" है। utf8 प्राग्मा को या तो हटा दिया जाना चाहिए, या स्रोत यूटीएफ -8 में सहेजा जाना चाहिए।

[email protected]: ~/Milu/Dev/Perl > cat wide-char-in-print.pl 
use utf8; 
use strict; 
use warnings; 
# binmode STDOUT, ':utf8'; 
print "Группа сайтов РИА Новости\n"; 
[email protected]: ~/Milu/Dev/Perl > perl wide-char-in-print.pl 
Wide character in print at wide-char-in-print.pl line 5. 
Группа сайтов РИА Новости 

स्रोत सिरिलिक वर्ण हैं, इसलिए utf8 pragma क्रम में है। टर्मिनल में उन वर्णों को मुद्रित करने के लिए, STDOUT को यूटीएफ -8 पर भी सेट किया जाना चाहिए, जिसे आप binmode पर कॉल करके प्राप्त कर सकते हैं। यदि आप ऐसा नहीं करते हैं, तो एक चेतावनी एक चौड़ी (0x255 से परे यूनिकोड) के रूप में ट्रिगर की जाती है, चरित्र एक संकीर्ण (बाइट) आउटपुट चैनल के माध्यम से फिट नहीं होता है। यह अभी भी सही दिखाई देगा, क्योंकि पर्ल केवल बाइट्स को आउटपुट के रूप में आउटपुट करेगा, जो तब सही दिखने वाला होता है।

+1

यह सबसे अच्छा जवाब है था क्योंकि नए प्रोग्रामर को 'कष्टप्रद' चेतावनी को बंद करने के बजाय, आपको यह नहीं करना चाहिए कि अगर आपको समझ में नहीं आता कि आप उन्हें क्यों प्राप्त कर रहे हैं, तो यह आपको बताता है कि पहली बार उस चेतावनी को कैसे रोकें। आपकी तरफ से किसी समस्या को ठीक करने में आपकी सहायता के लिए अधिकांश चेतावनियां हैं। मैंने कहीं सुना है कि 99.9 99% समय, प्रोग्रामर, कंप्यूटर/कंपाइलर/दुभाषिया समस्या नहीं है। इस चेतावनी को बंद करना आसान है, लेकिन केवल परेशानियों को बंद करने की आदत में होना कम से कम कहना बुरा है। – osirisgothra

12

संभवतः आप utf8 में काम कर रहे हैं। आपको प्रत्येक फाइलहेडल के लिए utf8 हैंडलिंग चालू करना होगा।

binmode STDERR, ":encoding(utf8)"; 

आप use open ":encoding(utf8)" के साथ सभी मानक हैंडल के लिए ऐसा कर सकते हैं। अधिक जानकारी के लिए open देखें।

अंत में, आप utf8::all के साथ utf8-ify सब कुछ, अपने कोड, अपने फ़ाइल हैंडल और आपके तर्क कर सकते हैं।

नोट कि :utf8 UTF8 हैंडलिंग चालू हो जाती है लेकिन :encoding(utf8) चेकों डेटा मान्य UTF8 है, इसलिए यह सुरक्षित है। विवरण के लिए perldoc -f binmode देखें।

1

ही डिबग आउटपुट के साथ log4perl से Windows PowerShell कंसोल पर पर्ल का उपयोग कर

Wide character in print at C:/strawberry/perl/site/lib/Log/Log4perl/Appender/Screen.pm line 39. 

समाधान था (log4perl कॉन्फ़िग फ़ाइल में) समस्या

log4perl.appender.Screen.utf8 = 1 
मेरी राय में
संबंधित मुद्दे