أريد تحويل std::string إلى const wchar_t *
سؤال
هل هناك أي طريقة؟جهاز الكمبيوتر الخاص بي هو AMD64.
::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
عندما استخدمت:
loadU(&str);
يقول المترجم VS2005:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
كيف يمكنني فعل ذلك؟
المحلول
إذا كان لديك كائن std::wstring، فيمكنك الاتصال به c_str()
عليه للحصول على wchar_t*
:
std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();
نظرًا لأنك تعمل على سلسلة ضيقة، فستحتاج أولاً إلى توسيعها.هناك خيارات مختلفة هنا؛الأول هو استخدام Windows المدمج MultiByteToWideChar
نمط.سيعطيك ذلك LPWSTR
, ، وهو ما يعادل wchar_t*
.
نصائح أخرى
أولا تحويله إلى الأمراض المنقولة جنسيا :: wstring:
std::wstring widestr = std::wstring(str.begin(), str.end());
وثم الحصول على سلسلة C:
const wchar_t* widecstr = widestr.c_str();
وهذا يعمل فقط لسلاسل ASCII، لكنها لن تعمل إذا كانت السلسلة الأساسية هي UTF-8 المشفرة. باستخدام روتين تحويل مثل MultiByteToWideChar () يضمن أن تتم معالجة هذا السيناريو بشكل صحيح.
ويمكنك استخدام وحدات الماكرو ATL تحويل النص إلى تحويل (شار) سلسلة ضيقة إلى واسعة (wchar_t) واحد. على سبيل المثال، لتحويل الأمراض المنقولة جنسيا :: سلسلة:
#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);
ويمكنك أيضا تحديد الشفرة، حتى إذا كان يحتوي على الأمراض المنقولة جنسيا :: سلسلة أحرف UTF-8 يمكنك استخدام:
CA2W pszWide(str.c_str(), CP_UTF8);
ومفيدة جدا ولكن ويندوز فقط.
إذا كنت تستخدم Linux/Unix، فألق نظرة على mbstowcs() وwcstombs() المعرفة في GNU C (من ISO C 90).
يرمز mbs إلى "Multi Bytes String" وهو في الأساس سلسلة C المعتادة المنتهية بصفر.
يرمز wcs إلى Wide Char String وهو عبارة عن مجموعة من wchar_t.
لمزيد من التفاصيل الأساسية حول الأحرف العريضة، قم بإلقاء نظرة على وثائق glibc هنا.