Преобразование 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 содержит ненужные символы, и синтаксический анализ не выполняется: 05.01.2012 11:50:28

Существует ли преобразование BSTR в CString, которое работает в арабских настройках?


person Karthik Murugan    schedule 23.05.2012    source источник
comment
Безусловно, лучшим решением является прекращение использования MBCS.   -  person David Heffernan    schedule 23.05.2012


Ответы (2)


BSTR — это строка состоящий из кодовых точек Unicode в кодировке UTF-16 (широкие символы, 16 бит):

typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;

это означает, что специальные символы, такие как 'م', представлены одним WCHAR. В многобайтовой строке (char* или std::string в стиле C) эти специальные символы представлены большим количеством символов (поэтому она называется «многобайтовой»).

Причина, по которой ваш CString содержит ненужные символы, заключается в том, что вы извлекаете char* непосредственно из _bstr_t. Сначала вам нужно преобразовать эту строку с широкими символами в многобайтовую строку. Есть и другие способы сделать это, один из них — использовать Функция WideCharToMultiByte.

Этот вопрос также поможет вам: Как правильно использовать WideCharToMultiByte

person LihO    schedule 23.05.2012

То, что вы пытаетесь сделать, возможно с CString, несмотря на настройку MBCS, но он будет поддерживать только арабский язык.

Вероятно, гораздо проще начать поддерживать весь Unicode. Это можно сделать без особого ущерба для существующего кода (вы можете оставить std::string и char*), если будете следовать инструкциям в разделе Windows на utf8everywhere.org.

person Pavel Radzivilovsky    schedule 24.05.2012