std::wstring बनाम std::string: Unicode के लिए क्या चुनें?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें
```html

परिचय: दो स्ट्रिंग्स, एक सिरदर्द

हर C++ डेवलपर को देर-सबेर एक दुविधा का सामना करना पड़ता है: std::string या std::wstring? दोनों ही स्ट्रिंग्स हैं, दोनों STL से हैं, लेकिन ये पूरी तरह से अलग व्यवहार करते हैं। यह प्रश्न विशेष रूप से बहुभाषी पाठ, इमोजी या चित्रलिपि के साथ काम करते समय उठता है।

यदि आप C++ में लिख रहे हैं और चाहते हैं कि आपका प्रोग्राम रूसी, जापानी या अरबी में "Привет, мир!" को सही ढंग से संसाधित करे — तो std::string और std::wstring के बीच अंतर को समझे बिना काम नहीं चलेगा। इस लेख में, हम दोनों दृष्टिकोणों का विश्लेषण करेंगे, उनकी प्रमुख विशेषताओं के आधार पर तुलना करेंगे और तय करेंगे कि कब किसका उपयोग करना चाहिए।

यह सामग्री Stack Overflow के एक वास्तविक प्रश्न पर आधारित है, जिसे हजारों बार देखा गया है। हमने इसे शैक्षिक उद्देश्यों के लिए अनुकूलित किया है, इसमें उदाहरण और एक स्पष्ट संरचना जोड़ी है।

std::string: क्लासिक और सरल

std::string, std::basic_string<char> का उपनाम है। प्रत्येक वर्ण 1 बाइट लेता है। ऐतिहासिक रूप से, char का उपयोग ASCII वर्णों के लिए किया जाता था, लेकिन आज यह अक्सर UTF-8 एन्कोडिंग (या केवल बाइट्स) में डेटा संग्रहीत करता है।

std::string के लाभ

  • मेमोरी की बचत — ASCII/UTF-8 के लिए प्रति वर्ण 1 बाइट।
  • अनुकूलता — अधिकांश लाइब्रेरीज़ के साथ काम करता है, जिसमें C फ़ंक्शन (strlen, strcpy) शामिल हैं।
  • गति — आवंटन पर कम ओवरहेड।
  • सर्वव्यापकता — नेटवर्क और JSON पर डेटा ट्रांसमिशन के लिए वास्तविक मानक।

std::string के नुकसान

  • एन्कोडिंग में भ्रम — std::string को यह नहीं पता होता कि डेटा किस एन्कोडिंग में संग्रहीत है। आप इसमें UTF-8 स्टोर कर सकते हैं, लेकिन .size() वर्णों की संख्या के बजाय बाइट्स की संख्या लौटाएगा।
  • Unicode समस्याएँ — स्ट्रिंग पर पुनरावृत्ति मल्टीबाइट वर्ण को तोड़ सकती है।
  • विस्तृत वर्णों के लिए अंतर्निहित समर्थन नहीं — UTF-8 के बाहर Unicode के साथ काम करने के लिए तृतीय-पक्ष लाइब्रेरीज़ को शामिल करना होगा।
// उदाहरण: UTF-8 के साथ std::string
#include <iostream>
#include <string>

int main() {
    std::string s = "Привет, мир!";
    std::cout << "बाइट्स में लंबाई: " << s.size() << std::endl; // 21 बाइट्स
    std::cout << "पहला वर्ण (char के रूप में): " << s[0] << std::endl; // कचरा: UTF-8 का पहला बाइट
    return 0;
}

इस उदाहरण में, s[0] 'П' नहीं, बल्कि दो-बाइट वर्ण 'П' (0xD0) का पहला बाइट लौटाएगा। यह शुरुआती लोगों की एक सामान्य गलती है।

std::wstring: विस्तृत वर्णों की शक्ति

std::wstring, std::basic_string<wchar_t> है। wchar_t का आकार प्लेटफ़ॉर्म पर निर्भर करता है: Windows पर 2 बाइट्स (UTF-16) और Linux/macOS पर 4 बाइट्स (UTF-32)।

std::wstring के लाभ

  • निश्चित वर्ण आकार (किसी विशिष्ट प्लेटफ़ॉर्म पर) — Unicode के साथ काम को सरल बनाता है।
  • लोकेल के लिए प्रत्यक्ष समर्थन — Windows में, सभी WinAPI फ़ंक्शन wchar_t के साथ काम करते हैं।
  • मल्टीबाइट वर्णों के साथ कम समस्याएँ — प्रत्येक वर्ण स्ट्रिंग का एक तत्व है।

std::wstring के नुकसान

  • आकार प्लेटफ़ॉर्म पर निर्भर करता है — कोड Windows और Linux पर अलग-अलग व्यवहार कर सकता है।
  • अधिक मेमोरी खपत — ASCII के लिए भी प्रति वर्ण 2 या 4 बाइट्स।
  • अनुकूलता समस्याएँ — सभी लाइब्रेरीज़ wchar_t का समर्थन नहीं करती हैं।
  • सरोगेट जोड़े — UTF-16 में, कुछ वर्ण (जैसे इमोजी) 2 wchar_t लेते हैं, जो फिर से "वर्ण ≠ तत्व" की समस्या पैदा करता है।
// उदाहरण: Windows पर std::wstring
#include <iostream>
```                

ब्लॉग

पुस्तक अनुशंसाएँ