Как получить и передать арабские символы в не-Unicode C ++ среде - PullRequest
2 голосов
/ 02 июля 2010

В настоящее время я работаю над проектом, написанным на 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 и отображать их правильно.

Есть идеи?

1 Ответ

1 голос
/ 02 июля 2010
CString Caption(static_cast<const char*>(tmp));  //convert it

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

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

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

...