C ++ में यूनिकोड प्रसंस्करण


107

C ++ में यूनिकोड प्रसंस्करण का सबसे अच्छा अभ्यास क्या है?

जवाबों:


81
  • अपने डेटा (या समान लाइब्रेरी) से निपटने के लिए ICU का उपयोग करें
  • अपने स्वयं के डेटा स्टोर में, सुनिश्चित करें कि सब कुछ उसी एन्कोडिंग में संग्रहीत है
  • सुनिश्चित करें कि आप हमेशा अपने यूनिकोड पुस्तकालय का उपयोग स्ट्रिंग कार्यों की लंबाई, पूंजीकरण की स्थिति जैसे सांसारिक कार्यों के लिए कर रहे हैं, कभी भी मानक पुस्तकालय बिल्डिंस का उपयोग न करें is_alphaजब तक कि वह परिभाषा नहीं है जो आप चाहते हैं।
  • मैं यह पर्याप्त नहीं कह सकते हैं: कभी नहीं पुनरावृति एक के सूचकांकों के ऊपर stringअगर आप सही होने के बारे में परवाह है, हमेशा इस बात के लिए अपने यूनिकोड पुस्तकालय का उपयोग करें।

जब तक आप stringबाइनरी डेटा के रूप में व्यवहार नहीं कर रहे हैं ।
डेमी

10

यदि आप पिछले C ++ मानकों के साथ पश्चगामी संगतता के बारे में परवाह नहीं करते हैं, तो वर्तमान C ++ 11 मानक ने यूनिकोड समर्थन में बनाया है: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

तो C ++ में यूनिकोड प्रसंस्करण के लिए वास्तव में सबसे अच्छा अभ्यास इसके लिए निर्मित सुविधाओं का उपयोग करना होगा। यह हमेशा पुराने कोड आधार के साथ एक संभावना नहीं है, हालांकि वर्तमान में मानक इतना नया है।

EDIT: स्पष्ट करने के लिए, C ++ 11 में यूनिकोड के बारे में पता है कि इसे अब यूनिकोड शाब्दिक और यूनिकोड स्ट्रिंग्स का समर्थन प्राप्त है। हालांकि, मानक पुस्तकालय में यूनिकोड प्रसंस्करण और रूपांतरण के लिए सीमित समर्थन है । आपकी वर्तमान जरूरतों के लिए यह पर्याप्त हो सकता है। हालाँकि, यदि आपको अभी भारी मात्रा में भारी उठाने की आवश्यकता है, तो आपको अभी भी अधिक गहन प्रसंस्करण के लिए ICU जैसी किसी चीज़ का उपयोग करने की आवश्यकता हो सकती है । विभिन्न एन्कोडिंग के बीच पाठ रूपांतरण के लिए अधिक मजबूत समर्थन शामिल करने के लिए वर्तमान में कुछ प्रस्ताव हैं । मेरा अनुमान (और आशा) यह है कि यह अगली तकनीकी रिपोर्ट का हिस्सा होगा ।


एक विशिष्ट मानक के संदर्भ के बिना ड्राफ्ट मानक डॉक्स का लिंक बहुत मददगार नहीं है, जिस पर आप चर्चा कर रहे हैं "यूनिकोड समर्थन में बनाया गया"।
बेन कॉलिन्स

1
@BenCollins धारा 2.14.5 "स्ट्रिंग शाब्दिक" - स्ट्रिंग शाब्दिकों पर चर्चा करता है, जिसमें UTF-8, UTF-16 और UTF-32 एन्कोडिंग के लिए स्ट्रिंग शाब्दिक शामिल हैं। धारा 22.4.1.4 "क्लास टेम्प्लेट कोडेकवेट" - वर्ण एन्कोडिंग (UTF-8, UTF-16 और UTF-32 सहित) के बीच परिवर्तित करने के लिए उपयोग किए जाने वाले कोडकवेट वर्ग की चर्चा करता है। पूरे दस्तावेज़ में यूनिकोड के समर्थन के बारे में अधिक जानकारी है, लेकिन ये इस विषय पर सबसे महत्वपूर्ण खंड हैं।
ईस्त्राद

9

हमारी कंपनी (और अन्य) मूल रूप से टैलिगेंट द्वारा विकसित यूनिकोड (ICU) लाइब्रेरी के लिए ओपन सोर्स इंटरनेशन कंपोनेंट्स का उपयोग करती हैं ।

यह तार, स्थान, रूपांतरण, दिनांक / समय, टकराव, रूपांतरण, एट को संभालता है। अल।

ICU यूजरगाइड के साथ शुरू करें


5

यहाँ विंडोज प्रोग्रामिंग के लिए एक चेकलिस्ट है:

  • सभी तार _T ("मेरा स्ट्रिंग") में संलग्न हैं
  • strlen () आदि फ़ंक्शन को _tcslen () आदि के साथ बदल दिया गया।
  • * और const char * के बजाय LPTSTR और LPCTSTR का उपयोग करें
  • देव स्टूडियो में नई परियोजनाएं शुरू करते समय, धार्मिक रूप से सुनिश्चित करें कि आपके प्रोजेक्ट गुणों में यूनिकोड विकल्प का चयन किया गया है।
  • C ++ स्ट्रिंग्स के लिए, std :: wstring का उपयोग std :: string के बजाय करें

11
जब तक आप यूनिकोड और एएनएसआई दोनों का निर्माण करने का इरादा नहीं करते हैं, तब तक "टी" स्ट्रिंग्स, चार्ट और फ़ंक्शन का उपयोग न करें। यदि आप केवल यूनिकोड का निर्माण करने का इरादा रखते हैं, तो बस नियमित रूप से विस्तृत वर्ण सामग्री करें: L "my wide string" wcslen (L "my string") आदि
1800 INFORMATION

सहमत, केवल _T मैक्रोज़ का उपयोग करें यदि आप सामान्य पाठ चाहते हैं, अर्थात, यूनिकोड और एससीआईआई / एमबीसीएस दोनों के लिए कोड करने की क्षमता।

1
यदि आप चाहते हैं कि C ++ स्ट्रिंग्स के लिए यूनिकोड और ANSI दोनों टाइपडिफ std जैसी कुछ चीज़ों का उपयोग करें :: basic_string <TCHAR> tString;
सर्ज

आह हाँ, मैं हमेशा #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif करता हूं लेकिन मुझे आपका रास्ता बेहतर सर्ज पसंद है।
एडम पियर्स

4
ईमानदारी से, मुझे लगता है कि UTF16 एक बेकार है, UTF8 में सभी एन्कोडिंग को सरल और तरीका * nix के साथ अधिक संगत है।
chacham15

3

को देखो सी में प्रकरण असंवेदनशील स्ट्रिंग तुलना ++

उस प्रश्न में यूनिकोड पर Microsoft दस्तावेज़ीकरण की एक कड़ी है: http://msdn.microsoft.com/en-us/library/cc194799.aspx

यदि आप उस लेख के बगल में MSDN पर बाएं हाथ के नेविगेशन पक्ष को देखते हैं, तो आपको यूनिकोड फ़ंक्शन से संबंधित बहुत सारी जानकारी मिलनी चाहिए। यह "एन्कोडिंग वर्ण" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx ) पर एक अध्याय का हिस्सा है

इसके निम्नलिखित उपखंड हैं:

  • कोड-पेज मॉडल
  • विंडोज में डबल-बाइट कैरेक्टर सेट
  • यूनिकोड
  • मिश्रित वातावरण में संगतता समस्याएँ
  • यूनिकोड डेटा रूपांतरण
  • यूनिकोड के लिए विंडोज-आधारित कार्यक्रम माइग्रेट करना
  • सारांश

2

हालाँकि यह सभी के लिए सर्वोत्तम अभ्यास नहीं हो सकता है, यदि आप चाहें तो आप अपनी C ++ UNICODE दिनचर्या लिख ​​सकते हैं!

मैंने अभी एक सप्ताह के अंत में इसे पूरा किया। मैंने बहुत कुछ सीखा, हालांकि मैं इसकी गारंटी नहीं देता कि यह 100% बग फ्री है, मैंने बहुत परीक्षण किया और यह सही ढंग से काम करता है।

मेरा कोड न्यू बीएसडी लाइसेंस के तहत है और यहां पाया जा सकता है:

http://code.google.com/p/netwidecc/downloads/list

इसे WSUCONV कहा जाता है और यह एक नमूना मुख्य () प्रोग्राम के साथ आता है जो UTF-8, UTF-16 और Standard ASCII के बीच परिवर्तित होता है। यदि आप मुख्य कोड को फेंक देते हैं, तो आपको UNICODE को पढ़ने / लिखने के लिए एक अच्छी लाइब्रेरी मिल गई है।


1

जैसा कि ऊपर कहा गया है कि एक बड़ी प्रणाली का उपयोग करते समय एक पुस्तकालय सबसे अच्छा शर्त है। हालाँकि कुछ बार आप अपनी स्वयं की चीज़ों को संभालना चाहते हैं (हो सकता है कि क्योंकि पुस्तकालय एक माइक्रो नियंत्रक पर कई संसाधनों का उपयोग करेगा)। इस मामले में आप एक साधारण पुस्तकालय चाहते हैं, जिसे आप उन चीजों के लिए बाहर रख सकते हैं, जिनकी आपको वास्तव में आवश्यकता है।

विलो श्लांगर का उदाहरण कोड एक अच्छा लगता है (अधिक विवरण के लिए उसका उत्तर देखें)।

मुझे एक और भी मिला जिसमें छोटा कोड है, लेकिन पूर्ण त्रुटि जांच का अभाव है और केवल UTF-8 को संभालता है, लेकिन भागों को बाहर निकालने के लिए सरल था।

यहां उन एम्बेडेड पुस्तकालयों की सूची दी गई है जो सभ्य लगते हैं।

एंबेडेड लाइब्रेरी



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