الترميز الافتراضي للمتغير BSTR إلى STD :: تحويل السلسلة

StackOverflow https://stackoverflow.com/questions/1827522

  •  11-09-2019
  •  | 
  •  

سؤال

لدي متغير BST تم سحبها من MSXML DOM، لذلك في UTF-16. أحاول معرفة الترميز الافتراضي مع هذا التحويل:

VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);

من الاختبار، أعتقد أن الترميز الافتراضي هو إما Windows-1252 أو ASCII، لكنني لست متأكدا.

راجع للشغل، هذا هو جزء من التعليمات البرمجية التي أقوم بتثبيتها وتحويل البديل إلى wstring والذهاب إلى ترميز متعدد البايات مع مكالمة إلى widechartomultibyte.

شكرا!

هل كانت مفيدة؟

المحلول

ال operator char* طريقة المكالمات _com_util::ConvertBSTRToString(). وثائق غير مفيد بشكل جيد، لكنني أفترض أنه يستخدم إعدادات اللغة الحالية للقيام بالتحويل.

تحديث:

داخليا، _com_util::ConvertBSTRToString() المكالمات WideCharToMultiByte, ، تمرير صفر لجميع برامج التعليمات البرمجية ومعلمات الحرف الافتراضية. هذا هو نفسه النجاح CP_ACP, ، مما يعني استخدام إعداد صفحة رمز ANSI الحالية للنظام (وليس إعداد الخيط الحالي).

إذا كنت ترغب في تجنب فقدان البيانات، فيجب عليك الاتصال WideCharToMultiByte مباشرة واستخدام CP_UTF8. وبعد لا يزال بإمكانك التعامل مع السلسلة كسلسلة واستخدام بايت واحدة تم إنهاءها ب Null std::string, ، لا يمكنك فقط علاج بايت كحرف.

نصائح أخرى

std::string بحد ذاته لا تحدد / تحتوي على أي ترميز. إنه مجرد سلسلة من البايتات. نفس الشيء يحمل std::wstring, ، وهذا مجرد تسلسل wchar_tS (كلمات بايت مزدوجة، على Win32).

عن طريق التحويل _bstr_t إلى أ char* من خلاله مشغل شار *, ، ستحصل ببساطة على مؤشر إلى البيانات الخام. وفقا ل MSDN., ، تتكون هذه البيانات من شخصيات واسعة، وهذا هو، wchar_tS، والتي تمثل UTF-16.

أنا مندهش لأنه يعمل بالفعل لبناء std::string من هذا؛ يجب عدم تجاوز أول بايت الصفر (والذي يحدث قريبا، إذا كانت السلسلة الأصلية هي اللغة الإنجليزية).

لكن منذ wstring هي سلسلة من wchar_t, ، يجب أن تكون قادرا على بناء واحد مباشرة من _bstr_t, ، كالآتي:

_bstr_t tmp(vtNodeValue);
wstring strValue((wchar_t*)tmp, tmp.length());

(لست متأكدا length; ؛ هل هو عدد البايتات أو عدد الأحرف؟) ثم، سيكون لديك wstring التي تشفيرها في UTF-16 التي يمكنك الاتصال بها WideCharToMultiByte.

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