2016-12-24 6 views
6

एन्कोडिंग अगर मैं एक स्ट्रिंग 7-बिट ASCII तालिका के बाहर एक चरित्र युक्त की लंबाई ले, मैं Windows और Linux पर अलग अलग परिणाम प्राप्त:सी स्ट्रिंग विंडोज़/लिनक्स

Windows: strlen("ö") = 1 
Linux: strlen("ö") = 2 

एक Windows मशीन स्ट्रिंग पर स्पष्ट रूप से "विस्तारित" एएससीआई प्रारूप में 0xF6 के रूप में एन्कोड किया गया है, जबकि लिनक्स मशीन पर यह 0xC3 0x96 के साथ यूटीएफ -8 में एन्कोड किया जाता है, जो 2 अक्षरों की लंबाई देता है।

प्रश्न:

क्यों एक सी स्ट्रिंग अलग ढंग से एक Windows और एक Linux मशीन पर इनकोडिंग हो जाता है?


सवाल एक चर्चा मैं कोड की समीक्षा (see this thread) पर एक साथी मंच के सदस्य के साथ था में आया।

+0

क्या दोनों स्रोत फ़ाइलें समान एन्कोडिंग और बीओएम सेटिंग का उपयोग कर रही हैं? – sidyll

+1

ऐसा लगता है कि स्थानीय सेटिंग्स से एन्कोडिंग उठाया जा सकता है। और ऐसा लगता है कि आप इसे भी सेट कर सकते हैं? https://gcc.gnu.org/onlinedocs/cpp/Invocation.html (-fwide-exec-charset = charset) – Sush

+0

क्योंकि Windows CP-1252 में डिफ़ॉल्ट है, और माइक्रोसॉफ्ट के दौरान यूटीएफ -8 के साथ कुछ समस्या है पिछड़ा संगत रखना चाहता है। इसे एसयू [विंडोज 7 यूटीएफ -8 और यूनिकोड] पर देखें (// superuser.com/q/221593) – Danh

उत्तर

5

एक सी स्ट्रिंग को विंडोज और लिनक्स मशीन पर अलग-अलग एन्कोड क्यों किया जाता है?

सबसे पहले, यह एक विंडोज़/लिनक्स (आपरेटिंग सिस्टम) मुद्दा नहीं है, लेकिन एक संकलक है एक के रूप में compilers विंडोज कि जीसीसी (लिनक्स पर सामान्य) की तरह सांकेतिक शब्दों में बदलना पर मौजूद हैं।

यह सी द्वारा अनुमति दी है और दो संकलक निर्माताओं को अपने स्वयं के कार्यक्रमों की लक्ष्यों प्रति विभिन्न कार्यान्वयन सनदी है, एमएस CP-1252 का उपयोग कर और लिनक्स Unicode का उपयोग कर। @Danh। एमएस के चयन पूर्व-तारीख यूनिकोड। कोई आश्चर्य की बात नहीं है कि विभिन्न कंपाइलर निर्माता विभिन्न समाधानों को नियुक्त करते हैं।

5.2.1 चरित्र पात्रों में से
1 दो सेट सेट और उनके संबद्ध collating दृश्यों डी फाई नेड होगी: सेट जो स्रोत लिखा जाता है (स्रोत चरित्र सेट) फाई लेस, और में सेट व्याख्या की निष्पादन वातावरण में (निष्पादन वर्ण सेट)। प्रत्येक सेट को मूल चरित्र सेट में विभाजित किया गया है, जिनकी सामग्री इस उपखंड द्वारा दी गई है, और शून्य या अधिक लोकेल-विशिष्ट सदस्यों (जो मूल चरित्र सेट के सदस्य नहीं हैं) नामक विस्तारित वर्ण । संयुक्त सेट को विस्तारित वर्ण सेट भी कहा जाता है। निष्पादन चरित्र सेट के सदस्यों के मान कार्यान्वयन-de fi ned हैं। C11dr §5.2.1 1 (मेरे जोर)

strlen("ö") = 1 
strlen("ö") = 2 

"ö" संकलक के स्रोत चरित्र बढ़ाया पात्रों प्रति एन्कोड किया गया है।

मुझे संदेह है कि एमएस अपने कोड बेस को बनाए रखने और अन्य भाषाओं को प्रोत्साहित करने पर केंद्रित है। लिनक्स यूनिकोड में सी के पहले एडाप्टर है, भले ही एमएस प्रारंभिक यूनिकोड प्रभावक रहा हो।

Unicode support grows के रूप में, मुझे उम्मीद है कि भविष्य का समाधान होगा।

+0

सी और यूटीएफ -8, दुःस्वप्न। उम्मीद है कि सी भविष्य में यूटीएफ -8 समर्थन जोड़ देगा। अगर सी जीना जारी रखना चाहता है, तो उसे बदलना चाहिए। http://julialang.org/utf8proc का उपयोग करना आसान नहीं है। – Stargateur

+1

@Stargateur रात के घोड़े के बारे में सहमत हैं। मुद्दा यूटीएफ -8 समर्थन को अपनाने के लिए बहुत अधिक नहीं है - यह अपेक्षाकृत आसान है - यह सी 11 के बाद से मौजूद है। (_6.4.5 स्ट्रिंग लिटरल्स_ जैसे 'u8 "हेलो" ') देखें, लेकिन पूर्व विस्तारित चरित्र को बनाए रखने/घटाने के साथ-साथ रास्ते-किनारे गिर रहे हैं। सभी सी के बाद, अभी भी डिग्राफ/ट्रिग्राफ हैं: भाषा संबंधी मुद्दों के लिए एक विरासत समाधान। इसमें दशकों लगेंगे। – chux

+0

उत्तर के लिए धन्यवाद! मैं विंडोज़ पर सिस्टम संस्करण 4.8.1 और जीनक्स पर एक ही विकल्प (-O0 -g3 -Wall -c -fmessage-length = 0) के साथ लिनक्स पर 4.8.4 पर जीसीसी का उपयोग कर रहा हूं। सुश द्वारा सुझाए गए विकल्पों के साथ मैं थोड़ा सा खेलूँगा। –

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