سؤال

هل هناك أي طريقة؟جهاز الكمبيوتر الخاص بي هو 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 هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top