كيف أقوم بتحويل System::WideString إلى char* والعكس؟
-
20-09-2019 - |
سؤال
لدي موقف حيث أحتاج إلى مقارنة أ char*
مع WideString
.
كيف يمكنني تحويل WideString إلى char* في C++؟
المحلول
ويمكنك استخدام وظيفة wcstombs.
size_t wcstombs (تشار * mbstr، wchar_t CONST * wcstr، كحد أقصى size_t) ؛
نصائح أخرى
WideCharToMultiByte () و < وأ href = "http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx" يختلط = "noreferrer نوفولو"> MultiByteToWideChar () .
غير ممكن.في الواقع، لقد خلطت بين مفهومين مختلفين:
- تتضمن السلسلة العريضة مخزنًا مؤقتًا بتشفير UTF-16.
- قد يحتوي char* على أي شيء، بدءًا من UTF-8 إلى نص ASCII فقط (وفي هذه الحالة، يكون هذا قابلاً للتحويل فقط إذا كانت السلسلة العريضة الخاصة بك لا تحتوي على أحرف غير ASCII).
يرجى الاطلاع على إجابتي على https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful حول كيفية التعامل مع النص بشكل صحيح.
ل يقارن أ System::WideString
كائن مع أ char*
(مثل السؤال جسم يقول أنك تريد أن تفعل)، يمكنك إنشاء ملف جديد WideString
كائن من المؤشر ثم استخدم العادي ==
المشغل أو العامل.يحتوي الفصل على العديد من المنشئات، بما في ذلك واحد لـ const char*
.
char* foo = ...;
WideString bar = ...;
if (WideString(foo) == bar)
std::cout << "They're equal!\n";
في الواقع، طالما أن WideString
الكائن على اليسار، فلن تحتاج حتى إلى استدعاء المنشئ لأنه سيتم تحويل المؤشر تلقائيًا.
if (bar == foo) { ... }
ل يتحول أ WideString
إلى أ char*
(مثل السؤال عنوان يقول أنك تريد القيام به)، قد تفكر في استخدام AnsiString
يكتب.انهم قابلة للتحويل بين بعضها البعض.للحصول على المؤشر العادي، اتصل بـ c_str
الطريقة، تماما كما تفعل مع std::string
.
WideString bar = ...;
AnsiString foo = bar;
std::cout << foo.c_str();