Конвертация 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.

Другие вопросы по тегам