std::wstring مقابل std::string: أيهما تختار لـ Unicode؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: سلسلتان، صداع واحد

\n\n

كل مطور C++ عاجلاً أم آجلاً يواجه معضلة: std::string أم std::wstring؟ يبدو أن كلاهما سلاسل، وكلاهما من STL، لكنهما يتصرفان بشكل مختلف تماماً. تبرز هذه المسألة بشكل خاص عند العمل مع النصوص متعددة اللغات، الرموز التعبيرية أو الحروف الهيروغليفية.

\n\n

إذا كنت تكتب بلغة C++ وتريد أن يعالج برنامجك بشكل صحيح "مرحباً بالعالم!" بالروسية أو اليابانية أو العربية — فلا غنى عن فهم الفرق بين std::string و std::wstring. في هذه المقالة، سنحلل كلا المنهجيتين، ونقارنهما وفقاً للمعايير الرئيسية، ونقرر متى نستخدم أياً منهما.

\n\n
هذه المادة مبنية على سؤال حقيقي من Stack Overflow حصد آلاف المشاهدات. قمنا بتكييفه للأغراض التعليمية، مع إضافة أمثلة وهيكل واضح.
\n\n

std::string: الكلاسيكية والبساطة

\n\n

std::string هو اسم مستعار لـ std::basic_string<char>. كل حرف يشغل 1 بايت. تاريخياً، كان char يُستخدم لرموز ASCII، لكنه اليوم غالباً ما يخزن البيانات بترميز UTF-8 (أو مجرد بايتات).

\n\n

مزايا std::string

\n
    \n
  • توفير الذاكرة — 1 بايت لكل حرف لـ ASCII/UTF-8.
  • \n
  • التوافق — يعمل مع معظم المكتبات، بما في ذلك دوال C (strlen, strcpy).
  • \n
  • السرعة — تكاليف تخصيص أقل.
  • \n
  • الانتشار — المعيار الفعلي لنقل البيانات عبر الشبكة وفي JSON.
  • \n
\n\n

عيوب std::string

\n
    \n
  • الارتباك مع الترميزات — std::string لا يعرف بترميز البيانات المخزنة. يمكنك تخزين UTF-8 فيه، لكن .size() سيعيد عدد البايتات، وليس الأحرف.
  • \n
  • مشاكل مع Unicode — التكرار عبر السلسلة قد يكسر الحرف متعدد البايت.
  • \n
  • لا دعم مدمج للأحرف العريضة — للعمل مع Unicode خارج UTF-8، ستحتاج إلى مكتبات خارجية.
  • \n
\n\n
// مثال: std::string مع UTF-8\n#include <iostream>\n#include <string>\n\nint main() {\n    std::string s = "Привет, мир!";\n    std::cout << "الطول بالبايتات: " << s.size() << std::endl; // 21 بايت\n    std::cout << "أول حرف (كـ char): " << s[0] << std::endl; // غير مفهوم: أول بايت من UTF-8\n    return 0;\n}
\n\n

في هذا المثال، s[0] لن يعيد الحرف 'П'، بل البايت الأول من الحرف ثنائي البايت 'П' (0xD0). هذا خطأ شائع بين المبتدئين.

\n\n

std::wstring: قوة الأحرف العريضة

\n\n

std::wstring هو std::basic_string<wchar_t>. حجم wchar_t يعتمد على المنصة: 2 بايت على Windows (UTF-16) و4 بايت على Linux/macOS (UTF-32).

\n\n

مزايا std::wstring

\n
    \n
  • حجم حرف ثابت (على منصة معينة) — يبسط العمل مع Unicode.
  • \n
  • دعم مباشر للإعدادات المحلية — في Windows، جميع دوال WinAPI تعمل مع wchar_t.
  • \n
  • مشاكل أقل مع الأحرف متعددة البايت — كل حرف هو عنصر واحد في السلسلة.
  • \n
\n\n

عيوب std::wstring

\n
    \n
  • الحجم يعتمد على المنصة — قد يتصرف الكود بشكل مختلف على Windows و Linux.
  • \n
  • استهلاك أكبر للذاكرة — 2 أو 4 بايت لكل حرف، حتى لـ ASCII.
  • \n
  • مشاكل في التوافق — ليست كل المكتبات تدعم wchar_t.
  • \n
  • الأزواج البديلة — في UTF-16، بعض الأحرف (مثل الرموز التعبيرية) تشغل 2 من wchar_t، مما يخلق مرة أخرى مشكلة "الحرف ≠ العنصر".
  • \n
\n\n
// مثال: std::wstring على Windows\n#include <iostream>\n#include                

المدونات

توصيات الكتب