लिनक्स और विंडोज .txt फ़ाइलों (यूनिकोड एन्कोडिंग) के बीच क्या अंतर हैं


16

मैं केवल मूल ANSI मानक में परिभाषित 128 वर्ण सेट का उपयोग कर रहा हूं।

लेकिन एक पूरे के रूप में फ़ाइलों को अलग-अलग तरीके से कैसे लगाया जाता है।

मुझे डिस्प्ले से कोई सरोकार नहीं है, यानी अगर टैब को 6 या 8 अक्षरों के साथ प्रदर्शित किया जाता है, लेकिन मेमोरी में वास्तविक आंतरिक प्रतिनिधित्व

एक अंतर जो मैंने सुना है वह लाइन समाप्ति (लिनक्स) के लिए \ r \ n (विंडोज) बनाम \ n का उपयोग है।


मुझे लगता है कि बाइट ऑर्डर मार्क मेरी php फाइलों में मेरी #! (पहली पंक्ति) को मार रहा है जिसे मैंने विंडोज़ से लिनक्स में स्थानांतरित कर दिया है। पूरी फाइल काम करती है लेकिन यह दुभाषिया को वैसा नहीं पा सकती है जैसा उसे चाहिए। अगर मैं specefically नोटपैड में एन्कोडिंग विधि का चयन करके ANSI में सांकेतिक शब्दों में बदलना करने के लिए सुनिश्चित करें कि क्या यह सही ASCII है या विंडोज कुछ और करता है

देखें कि क्या आपके गुन्नू / लिनक्स बॉक्स पर बमबारी है। यह डेबियन (और कम से कम कुछ अन्य) का हिस्सा है, लेकिन इसे स्थापित करने की आवश्यकता हो सकती है। इसकी आवश्यकता है क्योंकि Microsoft ने गलत तरीके से utf-8 फ़ाइलों के प्रारंभ में BOM जोड़ दिया है।
ctrl-alt-delor-

जवाबों:


17

विंडोज पर "यूनिकोड" UTF-16LE है, और प्रत्येक वर्ण 2 या 4 बाइट्स है। लिनक्स UTF-8 का उपयोग करता है, और प्रत्येक वर्ण 1 और 4 बाइट्स के बीच होता है।

"एब्सोल्यूट मिनिमम हर सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स (नो बहाने) के बारे में सकारात्मक रूप से जानना चाहिए!"


विंडोज एक बाइट बर्बाद करता है?

1
यदि आप लैटिन -1 के बाहर कुछ भी उपयोग नहीं कर रहे हैं, तो हाँ।
इग्नासियो वाज़क्वेज़-अब्राम्स

वे उस लेख में हैं जिससे मैं जुड़ा हुआ हूं।
इग्नासियो वाज़केज़-अब्राम्स

1
UTF-16LE के लिए खोज करें लेकिन लेख में नहीं मिला।

1
अधिकतर। यदि आपको वर्तमान में BOM गिनना है ।
इग्नासियो वाज़केज़-अब्राम्स

11

कतार टूट जाती है

विंडोज CRLF ( \r\n, 0D 0A) लाइन एंडिंग का उपयोग करता है जबकि यूनिक्स सिर्फ LF ( \n, 0A) का उपयोग करता है ।

अक्षरों को सांकेतिक अक्षरों में बदलना

अधिकांश आधुनिक (अर्थात, 2004 या उसके बाद से) यूनिक्स जैसी प्रणालियां UTF-8 को डिफ़ॉल्ट वर्ण एन्कोडिंग बनाती हैं।

हालाँकि, Windows में UTF-8 के लिए मूल समर्थन का अभाव है। यह आंतरिक रूप से UTF-16 में काम करता है, और यह मानता है कि char-बड़े तार एक विरासत कोड पृष्ठ में हैं । सौभाग्य से, नोटपैड UTF-8 फ़ाइलों को पढ़ने में सक्षम है; दुर्भाग्य से, "ANSI" एन्कोडिंग अभी भी डिफ़ॉल्ट है।

समस्याग्रस्त विशेष वर्ण

U + 001A SUBSTITUTE

विंडोज (कभी-कभी) का उपयोग करता है Ctrl+ Zएक अंत के फ़ाइल चरित्र के रूप में। उदाहरण के लिए, यदि आप typeकमांड प्रॉम्प्ट पर एक फाइल करते हैं, तो यह पहले 1Aबाइट पर छोटा हो जाएगा ।

यूनिक्स पर, Ctrl+ Zकुछ खास नहीं है।

यू + फीफा शून्य नो-ब्रेक स्पेस (बाइट-ऑर्डर मार्क) के साथ

विंडोज पर, यूटीएफ -8 फाइलें अक्सर EF BB BFएएनएसआई फाइलों से उन्हें अलग करने के लिए "बाइट ऑर्डर मार्क" से शुरू होती हैं ।

लिनक्स पर, BOM को हतोत्साहित किया जाता है क्योंकि यह शेल स्क्रिप्ट में शेबंग लाइन्स जैसी चीजों को तोड़ता है। इसके अलावा, जब UTF-8 वैसे भी डिफ़ॉल्ट एन्कोडिंग है तो UTF-8 हस्ताक्षर होना व्यर्थ होगा।


1
Ctrl-Z विंडोज़ पर उसी तरह काम करता है जैसे कि Ctrl-D (या आपके पास EOF के साथ जो भी वर्ण है stty) लिनक्स पर करता है: कंसोल ड्राइवर इसे फ़ाइल के अंत में अनुवाद करता है। शाब्दिक वर्ण इनपुट स्ट्रीम में प्रकट नहीं होता है; यह सिर्फ पढ़ने का कारण बनता है () लौटने के लिए 0.
psusi

मुझे लगता है कि बाइट ऑर्डर मार्क मेरी php फाइलों में मेरी #! (पहली पंक्ति) को मार रहा है जिसे मैंने विंडोज़ से लिनक्स में स्थानांतरित कर दिया है। पूरी फाइल काम करती है लेकिन यह दुभाषिया को वैसा नहीं पा सकती है जैसा उसे चाहिए। अगर मैं नोटपैड में एन्कोडिंग विधि का चयन करके ANSI में सांकेतिक शब्दों में बदलना सुनिश्चित करता हूं तो क्या यह सही ASCII है या विंडोज कुछ और करता है?

1
यह ध्यान देने योग्य है कि छद्म शब्द "एएनएसआई कोड पृष्ठ", हालांकि अभी भी नोटपैड जैसे कार्यक्रमों में प्रकट होता है, पूरी तरह से एक मिथ्या नाम है, और माइक्रोसॉफ्ट ने यह बहुत पहले स्वीकार किया था। देखें en.wikipedia.org/wiki/Windows_code_page जानकारी के लिए।
इंनिस मिसी

utf-8 में BOM नहीं है, लेकिन MS-Windows एक को सम्मिलित करता है। यह सच नहीं है utf-8। यूटीएफ -8 के नियमों में से एक यह है कि किसी भी फाइल को एससीआई में प्रस्तुत किया जा सकता है, यूटीएफ -8 में बिट समान के लिए बिट है। इसके अलावा, आप स्ट्रीम में किसी भी बिंदु पर utf-8 पढ़ना शुरू कर सकते हैं।
ctrl-alt-delor-

3

एक अंतर जो मैंने सुना है वह लाइन ब्रेक (लिनक्स) के लिए \ r \ n (विंडोज) बनाम \ n का उपयोग है।

हाँ। अधिकांश UNIX पाठ संपादक इसे स्वचालित रूप से संभाल लेंगे, विंडोज प्रोग्रामर संपादक इसे संभाल सकते हैं, सामान्य पाठ संपादक (आधार नोटपैड) नहीं करेंगे।

लगता है कि कुछ संदर्भों में विंडोज़ को ईओएफ (Ctrl-Z) की आवश्यकता है, जबकि अंत में फ़ाइल का अंत , जबकि आपने शायद इसे UNIX में कभी नहीं देखा होगा।

याद रखें कि MacOS X अब UNIX नीचे है, इसलिए यह UNIX लाइन एंडिंग्स का उपयोग करता है। हालांकि OS X (MacOS 9 और नीचे) से पहले इसका अपना अंत (\ r) था

EDIT: अन्य प्रारूप में CR और LF:

  • \ n ASCII 0x0A, लाइन फीड (LF) है
  • \ r ASCII 0x0D है, कैरिज रिटर्न (CR)

ASCII वर्ण सेट में \ r \ n और \ n कहां हैं? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@ क्रिस \ n ASCII 0x0A, लाइन फ़ीड है। \ r ASCII 0x0D, कैरिज रिटर्न
रिच होमोलका

@ क्या EOF के बारे में? क्या यह एक एएनएसआई चरित्र है?

2
@barlop, टर्मिनल केऑस्ट्रोक का अनुवाद करता है (यह आमतौर पर cix-d पर यूनिक्स सिस्टम पर है) EOF में, जब तक कि इस नियंत्रण कुंजी को अक्षम नहीं किया गया है। एप्लिकेशन आपके द्वारा हिट की गई वास्तविक कुंजी के बजाय EOF पढ़ता है। यह कहना है, read()किसी भी विशिष्ट चरित्र के बजाय शून्य बाइट देता है।
Psusi

1
@barlop, यही मैं कह रहा हूं: यह किसी भी चरित्र को वापस नहीं करता है । read () उस बाइट की संख्या लौटाता है जिसे उसने आपके बफ़र में संग्रहीत किया है। EOF पर, यह आपको केवल शून्य बाइट्स देता है। यह संकेत है कि आप फ़ाइल के अंत तक पहुँच चुके हैं, और यह कि पढ़ने के लिए और कुछ नहीं है।
Psusi

1

यूनिकोड एन्कोडिंग का उपयोग क्या है ओएस आधारित नहीं है।

यहां तक ​​कि विंडोज notepad.exe में सूचीबद्ध विकल्प हैं- (मैं उस ब्रैकेट में डालूंगा जिसका नोटपैड का अर्थ है) एएनएसआई (यूनिकोड नहीं), यूनिकोड (नोटपैड का अर्थ यूनिकोड ले), यूनिकोड बिग एंडियन (बीई), यूटीएफ -8 है

एएनएसआई यूनिकोड नहीं है, इसमें बहुत सीमित संख्या में वर्ण शामिल हैं जिससे कि इसे अलग रखा जा सके।

लेकिन यह भी देखें कि नोटपैड ले, या बीई, या यूटीएफ -8 कर सकता है

और एक तरफ नोटपैड, यूटीएफ -8 एक बीओएम के साथ या बिना हो सकता है।

और मैं Windows का उपयोग Cygwin के साथ करता हूं, हालांकि Windows पोर्ट अच्छी तरह से \ n \ n कर सकते हैं, जबकि आप निर्दिष्ट करते हैं कि आपने sed देखा है।

यूनिकोड एन्कोडिंग किसी विशेष ओएस का उपयोग करने का कोई नियम नहीं है। अगर यह होता तो यह बहुत लचीला ओएस नहीं होता।

वास्तव में अंतर को देखने के लिए सॉफ़्टवेयर को जानें, सॉफ़्टवेयर का एक टुकड़ा एन्कोडिंग क्या उपयोग करता है या ऑफ़र करता है।

Cygwin और xxd, और / या एक हेक्स एडिटर प्राप्त करें और देखें कि फ़ाइल के अंदर वास्तव में क्या है। किसी फ़ाइल की पहचान करने में मदद करने के लिए 'फ़ाइल' कमांड का उपयोग करें। तब आप वास्तव में देखते हैं कि UTF 16bit LE क्या है। यूटीएफ 16 बिट बीई क्या है। UTF-8 क्या है (और UTF-8 BOM के साथ या उसके बिना हो सकता है)।

कभी-कभी आप नोटपैड को यूनिकोड के रूप में सहेजने के लिए कह सकते हैं (जिसके द्वारा नोटपैड का अर्थ है यूनिकोड 16 बिट थोड़ा एंडियन), और यह नहीं होगा। लेकिन एरियल यूनिकोड की तरह एक यूनिकोड फ़ॉन्ट चुनें, और चार्मैप से कुछ यूनिकोड अक्षरों में कॉपी करें और यह होगा .. और यह देखने का एक अच्छा तरीका है कि नोटपैड या जो भी सॉफ्टवेयर कर रहा है, वह एक फ़ाइल के हेक्स को देखकर है

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

Dd कमांड (एक * nix कमांड जिसे मैं विंडोज़ के भीतर साइबरविन से चलाता हूं) को स्विच कर सकता है

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

और नोटपैड यूटीएफ -16 बिग एंडियन या यूटीएफ -16 लिटिल एंडियन या यूटीएफ -8 के रूप में बचा सकता है

यहाँ छवि विवरण दर्ज करें

यदि आप एक तकनीकी व्यक्ति या यहां तक ​​कि सिर्फ एक नोटपैड उपयोगकर्ता हैं, तो आप अपने ओएस के कारण एक एन्कोडिंग के लिए बाध्य नहीं हैं!

मुझे लगता है कि UTF-8 UTF-16 की तुलना में अधिक समझ में आता है, UTF-16 उन अक्षरों के लिए भी 16 बिट्स का उपयोग करेगा जो केवल 8 बिट्स होना चाहिए। हालांकि, यह भी ध्यान रखें कि चार्मैप UTF-16 कोड दिखाता है।

उदात्त (एक विंडोज़ पाठ संपादक) डिफ़ॉल्ट रूप से यूटीएफ -8 के रूप में यूनिकोड बचाता है।

मैं विंडोज का उपयोग करता हूं और कभी-कभी यूनिकोड का उपयोग करता हूं, और मैं ज्यादातर यूटीएफ -8 का उपयोग कर रहा हूं।

और जैसा कि विंडोज तकनीकी रूप से लचीला है, लिनक्स कम से कम तकनीकी रूप से लचीला है!


क्या आपने कमांड्स fileऔर typeसाइगविन प्रॉम्प्ट के अंदर लिखा था ?
वेसनॉग

xxdऔर typeकमांड मानक Cygwin इंस्टालेशन I प्रेज़्यूम में गायब हैं। इसके अलावा मैं आपके परिणामों को पुन: पेश करना चाहता हूं।
वेसनॉग

1
@Vesnog typeएक मानक कमांड है, जिसे cmd.exe में बनाया गया xxdहै, इसकी सम्भावना नहीं है कि डिफ़ॉल्ट रूप से इसे साइबरविन के साथ इंस्टॉल नहीं किया जाता है, लेकिन जब आप साइबरविन स्थापित करते हैं या इसके बाद, यदि आप साइबरविन सेटअप शुरू करते हैं, तो आपको उन कमांडों की एक लंबी सूची मिलती है जिन्हें आप साइबरविन में उपयोग के लिए स्थापित कर सकते हैं, और बस xxd को cygwin सेटअप सर्च बॉक्स में टाइप करें और यह ऊपर आता है। vx7 की स्थापना के बाद से xxd भी उपलब्ध है ताकि आप इसे वहां से भी प्राप्त कर सकें।
बार्लोप

1
@Vesnog आप cygwin के अंदर या cygwin के बाहर साइबर कमांड चला सकते हैं। यदि आप उन्हें cygwin के बाहर चलाते हैं, तो c:\cygwin\binअपने पथ में (यदि वह जहाँ cygwin's बिन उपनिर्देशिका है) जोड़ दें। इसके अलावा किसी भी आंतरिक cmd कमांड जैसे 'टाइप' या 'dir', या किसी भी बाहरी exe जैसे calc.exe (विंडोज़ कैलकुलेटर) को cygwin के भीतर से चलाया / लॉन्च किया जा सकता है। बहुत ज्यादा कुछ भी जिसे साइबरविन से चलाया जा सकता है, सीएमडी से चलाया जा सकता है और इसके विपरीत। यदि आप बैश का उपयोग करना चाहते हैं, तो साइबरविन का उपयोग करें और यदि आप सिंगल बनाम डबल कोट्स के साथ मुद्दों में भाग लेते हैं, तो साइबरविन के भीतर और सीएमडी के भीतर सीएमडी वाले कमांड चलाएं।
बार्लोप

1
@Vesnog xxd एक फ़ाइल भी लिख सकता है, जैसे कि echo 61|xxd -r -p>a.aतब प्रयास करें type a.a ताकि आप वास्तव में xxd -p के साथ एक बाइट डंप प्राप्त कर सकें, बाइट्स को फिर से व्यवस्थित या संशोधित कर सकें और फिर इसे xxd -r -p में फीड करें और एक अलग एन्कोडिंग के साथ एक नई अलग फ़ाइल प्राप्त करें पुराने डेटा के आधार पर अलग-अलग डेटा। "फ़ाइल" कमांड बाइट्स के आधार पर एन्कोडिंग का पता लगा रही है।
बार्लोप

-1

लिनक्स UTF-8 का उपयोग करता है, और प्रत्येक वर्ण 1 और 6 बाइट्स के बीच है, न कि 1 और 4 बाइट्स के बीच।

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

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