2012-05-23 2 views
1

В моем проекте VC++ (VS2008) используется многобайтовый набор символов.Преобразование BSTR в CString для текста на арабском языке

Я следующий код, чтобы преобразовать строку даты 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: 28A

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

+2

Далеко и далеко лучшее решение - прекратить использование MBCS. –

ответ

1

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

typedef WCHAR OLECHAR; 
typedef OLECHAR* BSTR; 

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

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

Этот вопрос также поможет вам: How do you properly use WideCharToMultiByte

0

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

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

Смежные вопросы