2009-11-02 18 views
12

तरह जीसीसी "-finput-charset = CharSet" मैं कुछ नमूना प्रोग्राम हैं जो एन्कोडिंग के साथ सौदा बनाना चाहते हैं, विशेष रूप से मैं चाहते की तरह विस्तृत तार का उपयोग करें:विशिष्टता,

wstring a=L"grüßen"; 
wstring b=L"שלום עולם!"; 
wstring c=L"中文"; 

क्योंकि ये उदाहरण कार्यक्रम हैं।

यह जीसीसी के साथ बिल्कुल छोटा है जो स्रोत कोड को यूटीएफ -8 एन्कोडेड टेक्स्ट के रूप में मानता है। लेकिन, सीधा संकलन एमएसवीसी के तहत काम नहीं करता है। मुझे पता है कि मैं उन्हें एन्कोड दृश्यों का उपयोग करके एन्कोड कर सकता हूं लेकिन मैं उन्हें पठनीय पाठ के रूप में रखना पसंद करूंगा।

क्या कोई विकल्प है जिसे मैं "cl" के लिए कमांड लाइन स्विच के रूप में निर्दिष्ट कर सकता हूं ताकि इस काम को कर सके? वहां gcc'c -finput-charset

धन्यवाद की तरह किसी भी आदेश पंक्ति स्विच,

यदि नहीं आप कैसे सुझाव है पाठ उपयोगकर्ता के लिए प्राकृतिक होगा?

नोट: बीओएम को यूटीएफ -8 फ़ाइल में जोड़ना एक विकल्प नहीं है क्योंकि यह अन्य कंपाइलरों द्वारा गैर-संकलित हो जाता है।

टिप्पणी 2: मैं इसे MSVC संस्करण में काम करने के लिए> = 9 == वी.एस. 2008

असली जवाब की जरूरत है: वहाँ कोई समाधान नहीं

+3

यह वास्तव में आश्चर्यजनक है एमएसवीसी ++ में ऐसे कंपाइलर का विकल्प नहीं है। क्या शर्म की बात है ... –

+0

मुझे लगता है कि आप इस सवाल पूछते समय * स्रोत ** फ़ाइल ** ** वर्णमाला * का विनिर्देशन का मतलब है। * स्रोत वर्णसेट * मानक में टर्मिनल द्वारा आंतरिक रूप से उपयोग किए जाने वाले कार्यान्वयन परिभाषित वर्णसेट के लिए उपयोग किया जाता है। –

+1

@PiotrDobrogost यह किसी का अनुमान है कि माइक्रोसॉफ्ट ने संकलन और एसडीके के लिए यूटीएफ -8 को मूल रूप से समर्थन देकर बाकी दुनिया के साथ क्यों नहीं पकड़ा है, और प्रोग्रामर के जीवन में इतनी अक्षमता, परेशानी, भ्रम और दुःख जोड़ना है जो विंडोज अनुप्रयोगों को अंतर्राष्ट्रीय बनाना चाहिए एक यूटीएफ -8 दुनिया में। लेकिन मुझे लगता है; इसे गुणवत्ता के लिए देखभाल या चिंता पर * नौकरशाही * और * लाभ-उद्देश्य * कहा जाता है। –

उत्तर

7

उन लोगों के लिए जो "कभी भी बेहतर देर से" आदर्श वाक्य की सदस्यता लेते हैं, विजुअल स्टूडियो 2015 (कंपाइलर का संस्करण 1) अब इसका समर्थन करता है।

नया /source-charset कमांड लाइन स्विच आपको स्रोत फ़ाइलों की व्याख्या करने के लिए उपयोग किए गए वर्ण सेट एन्कोडिंग को निर्दिष्ट करने की अनुमति देता है।

/source-charset:utf-8 

या एक विशेष कोड पेज के दशमलव पहचानकर्ता (एक बिंदु से पहले):

/source-charset:.65001 

आधिकारिक यह एक एकल पैरामीटर, जो या तो IANA या आईएसओ चरित्र सेट के नाम पर किया जा सकता है लेता है प्रलेखन here है, और दृश्य C++ टीम ब्लॉग पर a detailed article describing these new options भी है।

एक पूरक /execution-charset switch भी है जो ठीक उसी तरह काम करता है लेकिन यह नियंत्रित करता है कि निष्पादन योग्य में कितना संकीर्ण चरित्र- और स्ट्रिंग-लिटरल उत्पन्न होते हैं। अंत में, एक शॉर्टकट स्विच है, /utf-8, जो /source-charset:utf-8 और /execution-charset:utf-8 दोनों सेट करता है।

ये कमांड लाइन विकल्प वर्ष #pragma setlocale और #pragma execution-character-set निर्देशों का असंगत हैं, और वे सभी स्रोत फ़ाइलों को विश्व स्तर पर लागू होते हैं।

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

5

ओपन File->Advances Save Options... करें Unicode(UTF-8 with signature) - Codepage 65001 एन्कोडिंग कॉम्बो में है। कंपाइलर स्वचालित एन्कोडिंग का स्वचालित रूप से उपयोग करेगा।


माइक्रोसॉफ्ट जवाब here के अनुसार:

यदि आप गैर- ASCII वर्ण चाहते हैं तो "आधिकारिक" और पोर्टेबल उन्हें प्राप्त करने के लिए जिस तरह से \ यू उपयोग करने के लिए है (या \ यू) हेक्स एन्कोडिंग (जो है, मैं सहमत हूं, सिर्फ सादा बदसूरत और त्रुटि प्रवण)।

संकलक जब किसी स्रोत फ़ाइल का सामना करना पड़ता है जिसमें बीओएम नहीं होता है तो संकलक फ़ाइल में एक निश्चित दूरी को आगे देखता है यह देखने के लिए कि क्या यह किसी भी यूनिकोड वर्णों का पता लगा सकता है - यह विशेष रूप से यूटीएफ -16 और यूटीएफ -16 बीई की तलाश करता है - अगर यह नहीं मिलता है तो यह मानता है कि इसमें एमबीसीएस है। मुझे संदेह है कि इस मामले में कि इस मामले में यह एमबीसीएस पर वापस आ जाता है और यही समस्या पैदा कर रहा है।

स्पष्ट होने के नाते वास्तव में सबसे अच्छा है और इसलिए मुझे पता है कि यह एक सही समाधान नहीं है मैं बीओएम का उपयोग करने का सुझाव दूंगा।

जोनाथन गुफा
दृश्य सी ++ कंपाइलर टीम।


अच्छा समाधान संसाधन फ़ाइलों में पाठ स्ट्रिंग्स रखकर किया जाएगा। यह सुविधाजनक और पोर्टेबल तरीका है। अनुवादों को प्रबंधित करने के लिए आप gettext जैसे स्थानीयकरण पुस्तकालयों का उपयोग कर सकते हैं।

+0

फ़ाइल पहले से ही यूटीएफ -8 – Artyom

+0

में एन्कोड किया गया है कंपाइलर स्वचालित रूप से फ़ाइल में स्ट्रिंग स्थिरांक को परिवर्तित करता है, इसलिए परिणामस्वरूप यूसीई 2 एन्कोडिंग का उपयोग करके स्ट्रिंग को EXE में संग्रहीत किया जाएगा। –

+0

ठीक है, मैं देखता हूं कि आप यूटीएफ -8 में मैन्युअल रूप से "बीओएम" चिह्न जोड़ते हैं, और यह वास्तव में काम करता है, लेकिन समस्या यह जीसीसी और अन्य कंपाइलर्स के साथ काम नहीं करती है जो अर्थहीन बीओएम की अपेक्षा नहीं करते हैं। – Artyom

1

वी.एस. के लिए आप उपयोग कर सकते हैं:

#pragma setlocale("[locale-string]") 

स्थान के डिफ़ॉल्ट एएनएसआई कोड पेज फ़ाइल एन्कोडिंग के रूप में इस्तेमाल किया जाएगा।

लेकिन आम तौर पर आपके कोड में किसी उपयोगकर्ता-दृश्य स्ट्रिंग को हार्ड-कोड करना एक बुरा विचार है। उन्हें किसी प्रकार के संसाधनों में स्टोर करें। स्थानीयकरण, आसान वर्तनी-जांच और अद्यतन करने के लिए अच्छा, आदि

+0

स्वीकार करना "लेकिन सामान्य रूप से आपके कोड में किसी भी उपयोगकर्ता-दृश्य स्ट्रिंग को हार्ड-कोड करना एक बुरा विचार है" मुझे पता है, लेकिन यह ज्यादातर उदाहरणों के लिए है जहां उपयोगकर्ता के लिए ऐसी चीजें महत्वपूर्ण हैं जो वास्तव में देखने के लिए महत्वपूर्ण हैं हो जाता। लेकिन मैं लोकेल स्ट्रिंग में यूटीएफ -8 वर्णसेट कैसे निर्दिष्ट करूं? जहां तक ​​मुझे पता है कि विंडोज यूटीएफ -8 एन्कोडेड लोकेशंस का समर्थन नहीं करता है। – Artyom

+0

संक्षिप्त परीक्षण के बाद, एमएसवीसी 2005 'सेटलोकेल ("65001")' यानी यूटीएफ -8 कोड पेज 'स्वीकार करने में विफल रहता है। – Artyom

+0

65001 एक कोड पेज है, प्रज्ञा एक लोकेल लेती है। यूटीएफ -8 के साथ कोड पेज के रूप में कोई स्थान नहीं है। आप केवल वी.एस. में काम करने के लिए इसकी आवश्यकता है, तो आप इसे के रूप में सहेज सकते हैं UTF-16 (नोटपैड से का चयन करें और एन्कोडिंग "यूनिकोड" "सहेजें के रूप में") यह अन्यथा करने के लिए केवल पोर्टेबल रास्ते के रूप में यह से बचने के लिए है शेरवुड हू ने सुझाव दिया। यह पसंद है या नहीं, यह एकमात्र तरीका है। और सही तरीका यह है कि आप इसे फ़ाइल में हार्ड-कोड नहीं करना चाहते हैं :-) –

2

IMHO सभी सी ++ स्रोत फ़ाइलों को सख्त ASCII में होना चाहिए। यदि संपादक इसका समर्थन करता है तो टिप्पणियां यूटीएफ -8 में हो सकती हैं।
यह कोड प्लेटफार्मों, संपादकों और स्रोत नियंत्रण प्रणाली में पोर्टेबल बनाता है।

std::wstring str = L"\u20AC123,00"; //€123,00 
+5

Thants जो मैं बिल्कुल ** ** नहीं करना चाहता – Artyom

2

प्रवाह हम प्रयोग किया है::

आप एक विस्तृत स्ट्रिंग में यूनिकोड वर्ण सम्मिलित करने के लिए उपयोग कर सकते हैं \u फ़ाइलें लिनक्स के लिए, के रूप में बीओएम UTF8-साथ बचाने लिनक्स और विंडोज के बीच एक ही स्रोत का हिस्सा: preprocess बीओएम को हटाने के लिए संकलन कमांड पर स्रोत फाइलें, इंटरमीडिएट गैर-बीओएम फ़ाइल पर g ++ चलाएं।

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