प्रतीक BOM के साथ UTF-16 का निर्माण करता है


11

इस प्रश्न से प्रेरित होकर , क्या मैं iconvकिसी BOM के साथ और निर्दिष्ट धीरज के साथ UTF-16 आउटपुट जेनरेट करने के लिए कमांड का उपयोग कर सकता हूं ?

iconvएक से दूसरे एन्कोडिंग से आदेश धर्मान्तरित पाठ।

उदाहरण के लिए:

echo hello | iconv -f ascii -t utf-16

UTF-16 का प्रतिनिधित्व करता है "hello\n"

यूटीएफ -16 फाइलें अक्सर, लेकिन हमेशा नहीं, एक बाइट ऑर्डर मार्क (बीओएम) से शुरू होती हैं, जो यूनिकोड चरित्र का 2-बाइट एन्कोडिंग है U+FEFF। आप पहले दो बाइट्स हैं FE FFया नहीं, इसकी जाँच करके BOM के साथ UTF-16 फ़ाइल की समाप्ति का निर्धारण कर सकते हैं FF FE

iconvआदेश UTF-16 के उत्पादन पैदा करने के लिए कई विकल्प हैं:

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

यह आदेश:

echo hello | iconv -f ascii -t utf-16be

बिना किसी BOM वाले बड़े-एंडियन UTF-16 बनाता है ; ऐसा लगता है कि यदि आपने धीरज निर्दिष्ट किया है, तो आपको इसे आउटपुट में इंगित करने की आवश्यकता नहीं है। इसी तरह, utf-16leबिना बीओएम वाले छोटे-एंडियन यूटीएफ -16 उत्पन्न करता है।

इस:

echo hello | iconv -f ascii -t utf-16

एक बीओएम के साथ (मेरे x86 उबंटू सिस्टम पर) छोटे-एंडियन यूटीएफ -16 उत्पन्न करता है - लेकिन मैंने एक समान कमांड की रिपोर्ट देखी है जो बीओएम के साथ बड़े-एंडियन यूटीएफ -16 को उत्पन्न करता है, यहां तक ​​कि थोड़ा-एंडियन सिस्टम पर भी।

मैं हमेशा बॉम को मैन्युअल रूप से उपयोग utf-16beया utf-16leप्रीपेंड कर सकता हूं , लेकिन मैं एक ऐसे समाधान की तलाश कर रहा हूं जो सिर्फ iconvकमांड का उपयोग करता है ।

एक और वर्कअराउंड, यदि आप जानते हैं कि एंडियननेस क्या -t utf-16उत्पन्न करता है:

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

मैं जो उपयोग करना चाहता हूं वह कुछ इस प्रकार है:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

लेकिन iconvउस का समर्थन नहीं करता है।

संपादित करें:

क्या कोई x86 मैक OSX सिस्टम के साथ कोई व्यक्ति निम्नलिखित कमांड के (कॉपी-एंड-पेस्ट) आउटपुट दिखाते हुए एक टिप्पणी पोस्ट कर सकता है?

echo hello | iconv -f ascii -t utf-16 | od -x

1
एक बीओएम डेटा की पोर्टेबिलिटी को कम कर देता है लेकिन आप इसे इस तरह से जोड़
RedGrittyBrick

@RedGrittyBrick: यह पोर्टेबिलिटी (विशेषकर यूटीएफ -16 के लिए) को कैसे कम करता है? मुझे पता है कि मैं बीओएम को स्पष्ट रूप से उत्पन्न कर सकता हूं; मैं ऐसा करने का एक तरीका खोज रहा हूँ iconv- और सोच रहा था कि -t utf-16अंत्येष्टि को अनिर्दिष्ट छोड़ने के लिए क्यों लगता है।
कीथ थॉम्पसन

यदि आप इसे स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तो मुझे लगता है कि आइकॉव वर्तमान प्लेटफॉर्म बाइट-ऑर्डर कर रहा है। खिड़कियों के अलावा कुछ प्लेटफार्मों पर, कुछ टेक्स्ट प्रोसेसिंग टूल BOMs की उम्मीद नहीं करते हैं और इसलिए गलत काम करते हैं। एक उदाहरण हो सकता है जब सामग्री का निर्माण करने के लिए पाठ फ़ाइलों को संक्षिप्त करना, या फ़ाइल-आधारित टेम्पलेट्स का उपयोग करना। "आईएएनए पंजीकृत चार्ट्स के लिए UTF-16BE और UTF-16LE, एक बाइट ऑर्डर मार्क का उपयोग नहीं किया जाना चाहिए क्योंकि इन वर्ण सेट के नाम पहले से ही बाइट क्रम निर्धारित करते हैं"
RedGrittyBrick

यह प्रश्न दिखाता है iconv -f UTF-8 -t UTF-16, एक छोटे से एंडियन सिस्टम (मैकओएस) पर चलता है , जो एक बीओएम के साथ बड़े-एंडियन यूटीएफ -16 का निर्माण करता है, जो बहुत ही अजीब लगता है।
कीथ थॉम्पसन

जवाबों:


9

नहीं , यदि आप बाइट ऑर्डर को निर्दिष्ट करते हैं, तो iconvBOM सम्मिलित नहीं करता है।

यह यूनिकोड कंसोर्टियम से है

प्रश्न: मुझे BOM से कैसे निपटना चाहिए?

A: यहां कुछ दिशानिर्देशों का पालन किया गया है:

  1. एक विशेष प्रोटोकॉल (जैसे .txt फ़ाइलों के लिए Microsoft कन्वेंशन) को कुछ यूनिकोड डेटा धाराओं जैसे फ़ाइलों पर BOM के उपयोग की आवश्यकता हो सकती है। जब आपको इस तरह के प्रोटोकॉल के अनुरूप होना चाहिए, तो BOM का उपयोग करें।
  2. कुछ प्रोटोकॉल असंगत पाठ के मामले में वैकल्पिक BOMs की अनुमति देते हैं। उन मामलों में,
    • जहां एक पाठ डेटा स्ट्रीम को सादे पाठ के रूप में जाना जाता है, लेकिन अज्ञात एन्कोडिंग के रूप में, BOM को एक हस्ताक्षर के रूप में इस्तेमाल किया जा सकता है। यदि कोई BOM नहीं है, तो एन्कोडिंग कुछ भी हो सकता है।
    • जहां एक पाठ डेटा स्ट्रीम को सादे यूनिकोड पाठ (लेकिन जो एंडियन नहीं है) के रूप में जाना जाता है, तो BOM को एक हस्ताक्षर के रूप में उपयोग किया जा सकता है। यदि कोई बीओएम नहीं है, तो पाठ की व्याख्या बड़े-एंडियन के रूप में की जानी चाहिए।
  3. कुछ बाइट ओरिएंटेड प्रोटोकॉल एक फ़ाइल की शुरुआत में ASCII वर्णों की अपेक्षा करते हैं। यदि इन प्रोटोकॉल के साथ UTF-8 का उपयोग किया जाता है, तो BOM का उपयोग एन्कोडिंग फॉर्म हस्ताक्षर के रूप में किया जाना चाहिए।
  4. जहाँ डेटा स्ट्रीम का सटीक प्रकार ज्ञात है (जैसे यूनिकोड बिग-एंडियन या यूनिकोड लिटिल-एंडियन), BOM का उपयोग नहीं किया जाना चाहिए। विशेष रूप से, जब भी कोई डेटा स्ट्रीम UTF-16BE, UTF-16LE, UTF-32BE या UTF-32LE एक BOM का उपयोग नहीं किया जाना चाहिए

(मेरा जोर)

मुझे उम्मीद iconvहै कि इन दिशानिर्देशों में से अंतिम के लिए वफादार होने का प्रयास कर रहा हूं ।


अपडेट करें।

एक विषयांतर

मेरी राय में:

  1. BOM को निर्दिष्ट करने का एक विकल्प निश्चित रूप से iconv के लिए एक उपयोगी अतिरिक्त सुविधा होगी।

  2. एक बीओएम के बिना एक UTF-16LE फ़ाइल है कभी कभी अतिरिक्त प्रयास के साथ यद्यपि, Windows में प्रयोग करने योग्य। उदाहरण के लिए नोटपैड की फाइल ओपन डायलॉग आपको "यूनिकोड" का चयन करने की अनुमति देता है जो कि "UTF-16LE" के लिए Microsoft का नाम है और (बिना सोचे समझे) बिना BOM के फाइलों पर काम करने लगता है।

  3. मैं सामान्य रूप से Windows Notepad (XP) में UTF-16LE परीक्षण फ़ाइल (BOM के बिना) या UTF-8 परीक्षण फ़ाइल (BOM के बिना) खोल सकता हूं जैसे कि एक्सप्लोरर में फ़ाइल का नाम डबल-क्लिक करके। जो मेरे लिए उपयोगी लगता है। मुझे पता है कि कभी-कभी विंडोज गलत तरीके से एन्कोडिंग का अनुमान लगाएगा - जिस स्थिति में आपको फाइल को खोलते समय एन्कोडिंग को नोटपैड को बताना होगा। Windows पर उपयोग के लिए इच्छित पाठ फ़ाइलों के लिए BOM सहित यह असुविधा का अर्थ बेहतर है।

  4. यदि कोई विशिष्ट एप्लिकेशन BOM के साथ UTF-16LE फ़ाइल के अलावा किसी अन्य चीज़ से काम नहीं करेगा, तो मैं इस बात से सहमत हूँ कि BOM के बिना UTF-16LE फ़ाइल उस विशिष्ट अनुप्रयोग के लिए उपयोग करने योग्य नहीं है।

  5. मुझे संदेह है कि यदि आप UTF-8 (बिना बीओएम) के साथ सब कुछ काम कर सकते हैं, तो यह दीर्घकालिक में सबसे अच्छा समाधान है।

हालाँकि प्रश्न का उत्तर " क्या मैं एक BOM के साथ UTF-16 आउटपुट जेनरेट करने के लिए iconv कमांड का उपयोग कर सकता हूं और निर्दिष्ट धीरज के साथ " वर्तमान में " नहीं " है।


1
और पहले दिशानिर्देश के बारे में क्या, A.1? यदि मैं एक यूनिकोड पाठ फ़ाइल उत्पन्न करना चाहता हूं जो कि x86 विंडोज सिस्टम पर प्रयोग करने योग्य है, तो यह एक बीओएम के साथ थोड़ा-सा यूटीएफ 16 फाइल होना चाहिए ।
कीथ थॉम्पसन

@KeithThompson: सिस्टम को UTF16LE और UTF16BE दोनों को स्वीकार करना चाहिए । कम से कम विंडोज नोटपैड दोनों को स्वीकार करता है, जब तक यह आता है .txt- जब तक फ़ाइल में एक बीओएम है।
user1686

@KeithThompson: मैं इस बात से सहमत हूं कि दिशानिर्देश 1 को प्राथमिकता लेनी चाहिए, हालांकि एक BOM को निर्दिष्ट करने के लिए iconv आपके लिए कोई रास्ता नहीं प्रदान करता है। आपके मूल प्रश्न का उत्तर बस "नहीं" है।
RedGrittyBrick 10

जवाब नहीं मैं उम्मीद कर रहा था, लेकिन एक जवाब है, और एक पूरी तरह से एक!
कीथ थॉम्पसन

2
इस जवाब ने मेरी मदद की - मुझे यह जानने में मदद की कि मुझे क्यों डांटा गया था। मानक Windows कार्यक्रम निर्यात करने के लिए / रजिस्ट्री से आयात, C:\Windows\System32\reg.exeनिर्यात UTF-16 के ले के साथ बीओएम और होगा केवल UTF-16 पढ़ ले के साथ बीओएम - पढ़ा नहीं होगा UTF-16 ले बिना बीओएम और नहीं होगा UTF-16 बीई पढ़ बीओएम के साथ - दूसरे शब्दों में, यह पढ़ते समय BOM की मांग करता है लेकिन यह बहुत अच्छा है कि सही हो! (सौभाग्य से, यह UTF-8 पढ़ता है।)
davidbak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.