Как получить и передать арабские символы в среде C++, отличной от юникода

В настоящее время я работаю над проектом, написанным на C++ и использующим True OLE DBGrids с серверной частью MS Access. Все это работает хорошо, пока нам не нужно преобразовать наш графический интерфейс для отображения арабских символов. DBGrids не используют Unicode, поэтому мне нужен способ отображения символов из базы данных без использования Unicode. В настоящее время я установил региональные настройки языка на арабский, и когда я это сделал, я могу заставить сетки отображать арабские символы, но я не могу сделать это с помощью кода. Мне нужно иметь возможность переключаться между английским и арабским языком во время выполнения. Я могу извлечь данные из базы данных, а затем преобразовать их в формат, отличный от Unicode, используя следующий код:

_bstr_t tmp(vHolder.bstrVal, FALSE);   //wrap the BSTR
CString Caption(static_cast<const char*>(tmp));  //convert it
RetCaption = Caption;

С этим я могу отправить арабский язык в AfxMessageBox, и он отображается правильно, но я не могу заставить сетки принимать символы, отличные от Unicode, и отображать их правильно.

Любые идеи?


person jkoppee    schedule 01.07.2010    source источник


Ответы (1)


CString Caption(static_cast<const char*>(tmp));  //convert it

Это не конвертирует его. Он создает один символ, если tmp содержит текст на английском языке. И распространенная поговорка из земли Джиббер, если она содержит арабский текст. Преобразование из UTF-16, используемого OLE Automation и используемой вами DBGrid, в 8-битные символы невозможно выполнить с помощью приведения, для этого требуется функция преобразования. Например, WideCharToMultiByte или OLE2A.

Такое преобразование будет воспроизводить разборчивый текст только в том случае, если кодовая страница потока соответствует набору символов, используемому в строке. Что, если сетка показывает арабский язык, а ваш поток или кодовая страница, которую вы конвертируете, является английской, не производит ничего, кроме кучи вопросительных знаков.

Если вы не хотите, чтобы ваш код поддерживал Unicode, вы не можете переключаться между наборами символов на лету. Операционная система, в которой вы запускаете этот код, поддерживает его в течение последних 17 лет.

person Hans Passant    schedule 01.07.2010