"पूंछ -f | iconv -fsjis ”कुछ भी आउटपुट नहीं करता है


14

मैं tail -fएक फ़ाइल चाहता हूं , लेकिन इसकी सामग्री sjisएन्कोडिंग में है, इसलिए मुझे इसे अपने टर्मिनल के मूल (utf-8) एन्कोडिंग में परिवर्तित करने की आवश्यकता है।

जब मैं करता हूं

पूंछ -fx | iconv -fsjis

कोई आउटपुट नहीं होगा। जैसा

पूंछ x | iconv -fsjis

काम करता है, पहले मुझे लगा कि यह एक बफ़रिंग मुद्दा था, लेकिन कोशिश करना unbufferऔर stdbufजैसा कि पाइप में टर्न बफ़रिंग पर वर्णित किया गया था, इससे कोई फायदा नहीं हुआ।

वास्तव में, x में 10k से अधिक डेटा जोड़े जाने के बाद भी कोई आउटपुट नहीं होगा, इसलिए मुझे लगता है कि यह बफ़रिंग समस्या नहीं है (बफ़र 4k है, अगर मुझसे गलती नहीं है), लेकिन iconv केवल तभी आउटपुट देना शुरू करेगा जब यह एक EOF प्राप्त करता है।

तो मैं अपनी sjis एन्कोडेड फ़ाइल का पालन कैसे कर सकता हूं?

जवाबों:


11

(इसे एक चुटकी नमक के साथ लें) जहां तक ​​मुझे याद है, समस्या libiconvकाम करने के तरीके में निहित है । मल्टी-बाइट एन्कोडिंग को उन्हें डिकोड करने के लिए एक राज्य मशीन की आवश्यकता होती है, और libiconvपूरे वर्ण प्राप्त करना पसंद करते हैं, इसलिए आप इसे केवल एक फ़ंक्शन कॉल में आधा चरित्र और अगले आधे भाग में नहीं दे सकते।

मैं एक और दो समाधानों के बारे में सोच सकता हूं, एक अच्छा आउट-ऑफ-बैंड तरीका है, दूसरा एक इन-बैंड हैक है।

टर्मिनल एमुलेटर एन्कोडिंग बदलें (आउट-ऑफ-बैंड) : एक आपके टर्मिनल एमुलेटर में कैरेक्टर एन्कोडिंग को बदलना है, इसलिए इसका मूल एन्कोडिंग शिफ्ट JIS है। मैंने अभी जाँच की है konsole, और यह समर्थन करता है। मेनू से, व्यू → कैरेक्टर एन्कोडिंग → जेपनीज़ → एसजिस। आप तब केवल tail -fफ़ाइल कर सकते हैं , और konsoleमल्टीबीट वर्णों को डिकोड करने और उन्हें फ़ॉन्ट ग्लिफ़ तक मिलान करने का ध्यान रखेंगे।

फ्लाई पर ट्रांसकोड टर्मिनल एन्कोडिंग (इन-बैंड; सर्वश्रेष्ठ) : गाइल्स के सौजन्य से, जिसने मुझे luitबहुत लंबे समय के बाद याद दिलाया । उपयोग luit, जो आपके XOrg वितरण (डेबियन पर, यह पैकेज है x11-utils) के साथ आना चाहिए था । इसे इस तरह उपयोग करें:

$ luit -encoding SJIS -- tail -f x

यह टर्मिनल ट्रांसकोड SJIS / को आपके टर्मिनल एन्कोडिंग से / और रन करेगा tail -f x। इसका नकारात्मक पक्ष luitयह है कि यह समर्थित एनकोडिंग के धन का समर्थन नहीं करता है libiconv। उल्टा यह लगभग हर जगह उपलब्ध है।

फ्लाई (इन-बैंड; हैक) पर ट्रांसकोड टर्मिनल एन्कोडिंग : ttyconvएक हैक है जिसे मैंने कई साल पहले लिखा था (शुरुआत में सी, बाद में पायथन में फिर से बनाया गया) जो libiconvट्रांसकोड टर्मिनल I / O का उपयोग करता है। यह एक नया pseudoterminal और (a) आपके स्थानीय कोडिंग से आपके द्वारा लिखे गए वर्णों को दूरस्थ एन्कोडिंग में ट्रांसकोड करता है, और (b) आपके द्वारा दूरस्थ एन्कोडिंग से प्राप्त वर्णों को आपके स्थानीय एन्कोडिंग में ट्रांसकोड करता है। मैंने इसका उपयोग उन सर्वरों से बात करने के लिए किया था जो मानक लिनक्स टर्मिनलों द्वारा समर्थित नहीं थे। कृपया ध्यान दें कि मैंने जिन रिमोट एनकोडिंग के साथ इसका परीक्षण किया था, वे सभी सिंगल-बाइट एन्कोडिंग थे, इसलिए मैं यह गारंटी नहीं दे सकता कि यह शिफ्ट JIS के लिए काम करेगा। मुझे अक्सर इन दिनों इसका उपयोग करने के लिए कॉल नहीं मिलता है, अधिकांश सिस्टम यूनिकोड पर स्विच करते हैं।

इस तरह से आप इसका उपयोग करेंगे:

$ ttyconv -rsjis -- tail -f x

नकारात्मक पक्ष यह ttyconvहै कि मैंने इसे लिखा था, कोई भी इसका उपयोग नहीं करता है लेकिन मुझे, यह शायद कीड़े से भरा है। मैं इस पर उत्कृष्टता। उल्टा यह है कि यह उपयोग करता है libiconv, इसलिए यदि आपका एन्कोडिंग असामान्य है, तो यह आपकी सबसे अच्छी शर्त है। अंतिम गणना में, ttyconv --list100 एनकोडिंग का समर्थन करता है।


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

2
इन दिनों, वहाँ है luit मानक X11 उपयोगिता सूट का हिस्सा है, जो आपके समान है ttyconv
गिल्स का SO-

@Gilles luit समान है, सिवाय इसके कि यह मेरी तुलना में कहीं बेहतर काम करता है। ;) धन्यवाद! यही कारण है कि मैंने पहली जगह का उपयोग करना बंद कर दिया। 12 साल में जब से मैं कमांड का नाम भूल गया, तब से मैं इसकी तलाश कर रहा हूं।
एलेक्सियो

@ गिल्स luitमेरे लिए भी काम करता है। आप इसे 'आधिकारिक' उत्तर क्यों नहीं बनाते? यह मेरी स्थापना (डेबियन) का हिस्सा था, और इस तरह मेरे लिए उपयोग करना सबसे आसान है।
यूजीन बेरेसोव्स्की

1
मैंने शामिल करने के उत्तर को अपडेट किया luit एसजेआईएस के लिए सबसे अच्छा विकल्प के रूप में । अफसोस की बात है, ऐसा लगता है कि यह हर एन्कोडिंग का समर्थन नहीं libiconvकरता है। लगता है कि मुझे अभी भी अपने स्वयं के असली उद्देश्यों के लिए अपने स्वयं के समाधान का उपयोग करना होगा। :)
अलेक्सियो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.