2015-08-27 5 views
10

द्वारा पढ़ा जाने के लिए स्वीकार नहीं किया गया है कृपया मुझे पहले यह बताएं कि यह समस्या सीधे पर्दे हीरा ऑपरेटर से संबंधित है जो सीधे कीबोर्ड पर टाइप की गई इनपुट स्वीकार कर रही है।उमलॉट चरित्र को कीबोर्ड (कोडपेज 65001, यूटीएफ -8) के माध्यम से पर्ल स्क्रिप्ट

क्या मैंने पर्ल हीरा ऑपरेटर के बारे में बात की थी कि इनपुट को स्वीकार कर लिया गया है कि फ़ाइल से पाठ से पाइप किया गया है या नहीं, तो हाँ, यह प्रश्न 51 9 30 9 - How do I read Utf-8 with diamond operator का डुप्लिकेट होगा।

हालांकि, यह पाइप या फ़ाइल डेटा के बारे में नहीं है, बल्कि इनपुट के बारे में है जो सीधे कीबोर्ड पर टाइप किया गया है। इसलिए, मैं तर्क है, इस सवाल का नहीं 519309.

का डुप्लिकेट है यहाँ मेरे सवाल का विवरण हैं:

मैं यूमलॉट वर्णों ('ए' का उपयोग करने की कोशिश कर रहा हूँ, 'O', 'यू', ...) मेरे कीबोर्ड पर।

मैं एक बहुत ही सरल पर्ल स्क्रिप्ट जो कीबोर्ड से एक लाइन तुरंत स्वीकार करता है और उसके बाद स्क्रीन पर फिर से इसे बाहर प्रिंट है:

अगर मैं कोड पृष्ठ पर 1252 के साथ यूमलॉट वर्णों का उपयोग करें, तो सब कुछ उम्मीद के रूप में काम करता है:

C:\>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 1252 
*** ü 
--- ü 

हालांकि, अगर मैं कोड पृष्ठ पर 65001 के साथ एक ही यूमलॉट वर्णों का उपयोग करें (UTF-8), तो मैं एक चेतावनी अप्रारंभीकृत मूल्य मिलता है और ऊमलायूट स्वीकार नहीं किया है:

C:\>chcp 65001 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 65001 
*** ü 
Use of uninitialized value $txt in print at -e line 1. 
--- 

अगर मैं पाइप मेरी पर्ल कार्यक्रम में ऊमलायूट, तो मैं कोई समस्या नहीं है:

C:\>chcp 65001 & echo ü | perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;" 
Page de codes active : 65001 
*** --- ü 

मैं के साथ यह चेतावनी क्यों मिलता है कोडपेज 65001 (UTF-8)?

मैं स्ट्रॉबेरी पर्ल 5.22 के साथ विंडोज 7 x64 का उपयोग कर रहा हूं।

सिर्फ रिकॉर्ड के लिए, यदि मैं शुद्ध बैच कमांड का उपयोग करता हूं (जो कि मैं पर्ल का उपयोग नहीं करता), तो मैं कोडपृष्ठ 65001 (यूटीएफ -8) के साथ उमलॉट वर्णों में सफलतापूर्वक कुंजी कर सकता हूं।

C:\>chcp 65001 & set /p txt=*** & echo --- %txt% 
Page de codes active : 65001 
*** ü 
--- ü 

सवाल वास्तव में है: ठीक एक शुद्ध डॉस बैच आदेश के रूप में क्यों पर्ल नहीं कोडपेज 65001 के साथ कुंजीपटल द्वारा यूमलॉट वर्णों स्वीकार करने में सक्षम, एक ही कोड पृष्ठ पर 65001 है, जबकि उसी कुंजीपटल इनपुट,, काम करता है?

पाइपिंग उमलॉट पात्रों और कीबोर्ड से सीधे उमलॉट वर्ण टाइप करने के बीच कुछ मूल रूप से भिन्न लगता है।

कुंजीपटल पर एक उमलॉट चरित्र टाइप क्यों नहीं कर रहा है, जबकि एक ही चीज एक पाइप वाले चरित्र के रूप में पूरी तरह से ठीक काम करती है?

+0

क्या आपने विकल्प '-CS'' का प्रयास किया है? ('perl -CS -we') एसटीडीआईएन और एसटीडीओयूटी यूटीएफ -8 एन्कोडिंग –

+0

बनाने के लिए मैंने perl -CS -we की कोशिश की है - यह STDOUT को प्रिंट करने के लिए बिल्कुल सही काम करता है, लेकिन किसी कारण से, इसका STDIN पर कोई प्रभाव नहीं पड़ता (यह कहना है: मेरे पास अभी भी वही समस्या है - अनियमित मूल्य) – user2288349

+1

'सीएचसीपी 65001' सीएमडी में यूटीएफ -8 समर्थन flimsy है जब बाहरी अनुप्रयोगों जैसे 'perl' के साथ प्रयोग किया जाता है। यही वह जगह है जहां ConEmu जैसे रैपर आसान आते हैं। – wOxxOm

उत्तर

2

सांत्वना फ़ॉन्ट बदलने के लिए "ल्युसिडा कंसोल"

इसके अलावा, आप कंसोल में chcp 65001 चलाने का प्रयास कर सकते हैं की कोशिश करो। यह आदेश यूटीएफ -8

पर वर्ण सेट करेगा यदि आपको गलत प्रदर्शन मिलता है - सिस्टम में आवश्यक फ़ॉन्ट इंस्टॉल करें।

अधिक जानकारी here

असल समस्या पर्ल के अंतर्गत आता है नहीं है।यह विंडोज टर्मिनल से संबंधित है। कोशिश करें कि यह this console में कैसे काम करता है। आप इनपुट से पढ़े गए कुछ फ़ाइल बाइनरी डेटा पर लॉग इन कर सकते हैं और उन दो मामलों (टर्मिनल वीएस सिगविन) की तुलना करें

1

यह एक माइक्रोसॉफ्ट बग है। Windows APIs ReadFile() और ReadConsoleA() हमेशा कोड पेज 65001 पर 0 बाइट्स पढ़ते हैं (जो ईओएफ इंगित करता है)। विवरण के लिए this blog देखें।
चूंकि माइक्रोसॉफ्ट इसे ठीक नहीं करेगा, केवल एकमात्र उपलब्ध उत्तर पर्ल रखरखावकर्ता को ReadConsoleW() का उपयोग करने के लिए स्विच करने और परिणामस्वरूप विस्तृत वर्णों को WideCharToMultiByte (CP_UTF8, ...) के साथ utf-8 में परिवर्तित करने के लिए है।

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