पर्ल स्ट्रिंग आंतरिक रूप से कैसे प्रदर्शित होते हैं? क्या एन्कोडिंग का उपयोग किया जाता है? मैं अलग-अलग एन्कोडिंग को सही तरीके से कैसे संभालूं?पर्ल स्ट्रिंग्स आंतरिक
मैं काफी लंबे समय तक पेर्ल का उपयोग कर रहा हूं, लेकिन इसमें विभिन्न एन्कोडिंग में बहुत सी स्ट्रिंग हैंडलिंग शामिल नहीं थी, और जब मुझे एक मामूली समस्या का सामना करना पड़ा जिसमें एन्कोडिंग के साथ कुछ करना था, तो मैं आमतौर पर कुछ का सहारा लेता था शैमिक क्रियाएं
इस पल तक मैंने बाइट्स के अनुक्रमों के रूप में पर्ल स्ट्रिंग्स के बारे में सोचा, जो मेरे कार्यों के लिए बहुत अच्छी तरह फिट हुआ। अब मुझे यूटीएफ -8 एन्कोडेड फ़ाइल की कुछ प्रसंस्करण करने की आवश्यकता है और यहां परेशानी शुरू होती है।
पहले, मैं फ़ाइल स्ट्रिंग में इस तरह पढ़ें:
open(my $in, '<', $ARGV[0]) or die "cannot open file $ARGV[0] for reading";
binmode($in, ':utf8');
my $contents;
{
local $/;
$contents = <$in>;
}
close($in);
तो बस इसे प्रिंट:
print $contents;
और मैं दो बातें मिलती है: एक चेतावनी Wide character in print at <scriptname> line <n>
और कंसोल में एक कचरा। तो मैं निष्कर्ष निकाल सकता हूं कि पर्ल स्ट्रिंग्स में "चरित्र" की एक अवधारणा है जो "चौड़ी" हो सकती है या नहीं, लेकिन जब इन "चौड़े" वर्णों को मुद्रित किया जाता है तो कंसोल में एकाधिक बाइट्स के रूप में प्रतिनिधित्व किया जाता है, न कि एकल "चरित्र" के रूप में। (मुझे आश्चर्य है कि बाइनरी फाइलों के साथ मेरे पिछले पिछले अनुभव ने काफी काम क्यों किया है, मुझे उम्मीद है कि यह किसी भी "चरित्र" मुद्दों के बिना काम करने की उम्मीद है)।
फिर मुझे कंसोल में कचरा क्यों दिखाई देता है? यदि पर्ल कुछ ज्ञात एन्कोडिंग में चरित्र के रूप में तारों को स्टोर करता है, तो मुझे नहीं लगता कि कंसोल एन्कोडिंग और प्रिंट टेक्स्ट को सही तरीके से ढूंढने में बड़ी समस्या है। (मैं विंडोज, बीटीडब्ल्यू का उपयोग करता हूं)।
यदि पर्ल चर-चौड़ाई वाले वर्ण अनुक्रमों के रूप में तारों को स्टोर करता है (उदा। उसी यूटीएफ -8 एन्कोडिंग का उपयोग करके), ऐसा क्यों किया जाता है? मेरे सी अनुभव से हैंडलिंग स्ट्रिंग दर्द है।
अद्यतन।
मैं परीक्षण के लिए दो कंप्यूटरों का उपयोग करता हूं, एक अंग्रेजी भाषा पैक के साथ विंडोज 7 x64 चलाता है, लेकिन सक्रिय क्षेत्रीय सेटिंग्स के साथ रूसी क्षेत्रीय सेटिंग्स (इसलिए मेरे पास OEM कोडपेज और सीपी 1251 एएनएसआई के रूप में cp866 है) ActivePerl 5.10.1 x64 के साथ; दूसरा सिग्विन पर्ल 5.10.0 के साथ विंडोज एक्सपी 32 बिट रूसी स्थानीयकरण चलाता है।
लिंक के लिए धन्यवाद, अब मुझे क्या हो रहा है और चीजों को कैसे किया जाना चाहिए, इस बारे में और अधिक ठोस समझ है।
बहु-बाइट तारों से मेरा मतलब चर-चौड़ाई एन्कोडिंग था। – n0rd
वैसे भी मुझे नहीं मिलता कि मुझे स्पष्ट रूप से रूपांतरण क्यों करना है: मैंने इनपुट डेटा एन्कोडिंग निर्दिष्ट क्यों मुझे कुछ अतिरिक्त कदम उठाने हैं? – n0rd
आपने इनपुट एन्कोडिंग निर्दिष्ट की है। आप अपनी चीजें करते हैं फिर आप अपना आउटपुट एन्कोडिंग निर्दिष्ट करते हैं। जिन लेखों को मैं संदर्भित करता हूं उन्हें बेहतर समझाता है, मुझे सोचना चाहिए। – dylan