Конвертация BSTR в CString для арабского текста
Мой проект VC++ (VS2008) использует многобайтовый набор символов.
У меня есть следующий код для преобразования строки даты в COleDateTime
_bstr_t bstr_tDate = bstrDate; //bstrDate is populated by a COM function
const CString szStartDateTime = bstr_tDate.operator const char *();
bool bParseOK = oleDateTime.ParseDateTime(szStartDateTime);
Этот код хорошо работает во всех региональных настройках, но не работает в региональных настройках на арабском языке, где дата ввода имеет следующий формат: 21/05/2012 11: 50: 31 م
После преобразования CString содержит ненужные символы, и при синтаксическом анализе происходит сбой: 01/05/2012 11: 50: 28ã
Существует ли преобразование BSTR в CString, которое работает в арабских настройках?
2 ответа
BSTR - это строка, состоящая из кодовых точек Unicode в кодировке UTF-16 (широкие 16-битные символы):
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
Это означает, что специальные символы, такие как "م", представлены WCHAR
, В многобайтовой строке (стиль C char*
или же std::string
) это специальные символы, представленные большим количеством символов (поэтому они называются "многобайтовые").
Причина, по которой ваш CString
содержит ненужные символы, потому что вы получаете char*
прямо из _bstr_t
, Вам нужно сначала преобразовать эту строку с широким символом в многобайтовую строку. Есть несколько способов сделать это, один из них - использовать функцию WideCharToMultiByte.
Этот вопрос также поможет вам: как правильно использовать WideCharToMultiByte
То, что вы пытаетесь сделать, возможно с CString, несмотря на настройку MBCS, но она будет поддерживать только арабский язык.
Вероятно, гораздо проще начать поддерживать все Unicode. Это можно сделать без особого ущерба для существующего кода (вы можете сохранить std::string и char*), если будете следовать инструкциям в разделе Windows на utf8everywhere.org.