الترميز الافتراضي للمتغير BSTR إلى STD :: تحويل السلسلة
سؤال
لدي متغير 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_t
S (كلمات بايت مزدوجة، على Win32).
عن طريق التحويل _bstr_t
إلى أ char*
من خلاله مشغل شار *, ، ستحصل ببساطة على مؤشر إلى البيانات الخام. وفقا ل MSDN., ، تتكون هذه البيانات من شخصيات واسعة، وهذا هو، wchar_t
S، والتي تمثل 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
.