2014-06-24 5 views
12

के साथ स्ट्रिंग से बीओएम निकालें मुझे निम्नलिखित समस्या है: मैं एक यूटीएफ -8 टेक्स्ट फ़ाइल से पढ़ रहा हूं (और मैं पर्ल को बता रहा हूं कि मैं ऐसा कर रहा हूं ": एन्कोडिंग (utf-8)")। 43 6F 6E 66 65 72 65 6E 63 65पर्ल

यह जब मुद्रित "∩╗┐Conference" करने के लिए अनुवाद एफई बी बी बीएफ:

फ़ाइल इस तरह एक हेक्स दर्शक में लग रहा है। मैं "विस्तृत चरित्र" को समझता हूं जिसे मुझे बीओएम के बारे में चेतावनी दी जा रही है। मैं इससे छुटकारा पाना चाहता हूं (चेतावनी के कारण नहीं, बल्कि क्योंकि यह बाद में एक स्ट्रिंग तुलना को गड़बड़ कर देता है)।

तो मैं निम्नलिखित कोड का उपयोग कर इसे हटाने के लिए कोशिश की, लेकिन मैं बुरी तरह असफल:

$ लाइन = ~ s/^ \ XEF \ xbb \ xBF //;

क्या कोई मुझे यूटीएफ -8 बीओएम को एक स्ट्रिंग से हटाने के तरीके के बारे में बता सकता है जिसे मैंने यूटीएफ -8 फ़ाइल की पहली पंक्ति पढ़कर प्राप्त किया था?

धन्यवाद!

+0

आप आउटपुट एन्कोडिंग सही रूप से निर्धारित बीओएम दूर करने के लिए कोई ज़रूरत नहीं होना चाहिए के रूप में है, क्योंकि एक शून्य चौड़ाई स्थान होगा जब तक शॉर्टंड का उपयोग करने के लिए परिणाम – Borodin

उत्तर

9

EF BB BF बीओएम का यूटीएफ -8 एन्कोडिंग है, लेकिन आपने इसे डीकोड किया है, इसलिए आपको इसके डीकोडेड फॉर्म को देखना होगा। बीओएम एक शून्य चौड़ाई ब्रेक स्पेस (U + FEFF) एक फ़ाइल के शुरू में इस्तेमाल किया है, तो निम्न में से कोई भी करेंगे:

s/^\x{FEFF}//; 
s/^\N{U+FEFF}//; 
s/^\N{ZERO WIDTH NO-BREAK SPACE}//; 
s/^\N{BOM}//; # Convenient alias 

मैं "विस्तृत चरित्र को समझने "जिसे मुझे चेतावनी दी जा रही है वह बीओएम है। मैं इसे

आप विस्तृत चरित्र हो रही है, क्योंकि आप अपने आउटपुट फ़ाइल हैंडल पर एक :encoding परत जोड़ने के लिए भूल गया से छुटकारा पाने के लिए चाहते हैं। निम्नलिखित :encoding(UTF-8) को STDIN, STDOUT, STDERR में जोड़ता है, और इसे open() के लिए डिफ़ॉल्ट बनाता है।

use open ':std', ':encoding(UTF-8)'; 
+0

पर कोई प्रभाव नहीं, मुझे जोड़ने की आवश्यकता है charnames ': full'; – user1769925

+0

मुझे लगता है कि '\ N {...} के लिए 5.12 की आवश्यकता है 'मुझे लगता है कि' \ N {BOM} 'के लिए 5.14 की आवश्यकता है। 'charnames का उपयोग करें': पूर्ण '; ~ 5.16 से पहले की आवश्यकता है। – ikegami

+0

@ user1769925: ध्यान दें कि समस्या यह है कि आपने फ़ाइल से डेटा * डीकोड किया है (आपके ': एन्कोडिंग (utf-8) 'ओपन मोड के कारण) इसलिए इनपुट स्ट्रिंग का पहला * अक्षर * यूनिकोड' यू है + एफईएफएफ', लेकिन आप अपने प्रतिस्थापन – Borodin

3

बीओएम को शांत करने के लिए, आप इसे 3 अक्षरों नहीं है पता करने के लिए है, यह UTF में 1 है (U + FEFF):

s/^\x{FEFF}//; 
+0

ली अपवोट इसके संदर्भ में है जैसे कि यह एक विस्फोटक था। –

2

आप File::BOM का उपयोग कर फ़ाइल खोलते हैं, तो उसे निकाल देंगे आप के लिए बीओएम

use File::BOM; 

open_bom(my $fh, $path, ':utf8') 
0

आदर्श रूप से, आपके फ़ाइलहेडल को आपके लिए यह स्वचालित रूप से करना चाहिए। लेकिन अगर आप एक आदर्श स्थिति में नहीं हैं, यह मेरे लिए काम किया:

use Encode; 

my $value = decode('UTF-8', $originalvalue); 
$value =~ s/\N{U+FEFF}//;