2016-07-21 1 views
0

Я написал приложение, которое подключается к Active Directory, расположенному на Windows Server 2012. Сначала приложение извлекает имена организационных единиц из AD. Затем он получает пользователей из каждой организации, обрабатывает их и отправляет информацию в другой веб-адрес.C++ Обработка кириллических строк на английском языке Windows

Организации и пользователи из AD могут иметь имена как на английском, так и на русском языках.

Итак, когда я запускаю свое приложение в Windows с русским языком системы, все хорошо.

Но когда я пытаюсь запустить его на Windows Server (или Windows 7 с английским системным языком), я получаю последовательностей «?» вместо русского строки как в:

  1. Logfile выход
  2. консоли
  3. поиск Active Directory строка, которая содержит имя организации блока

Внутри приложения я попытался использовать std::string и std::wstring к провести извлечение из данных Active Directory и получить тот же результат - «?» вместо русских слов.

Использование MSVS 2013, Windows 8.1 на стенде разработчика. И libLDAP (установка версии 3) для подключения к Active Directory.

Что нужно сделать, чтобы мое приложение правильно обработало российские строки?

+1

* «Что мне нужно сделать, чтобы мое приложение корректно обрабатывать русские строки?» * - Вы должны прочитать [Абсолютный минимум каждый разработчик программного обеспечения Абсолютно Положительно должны знать О Unicode и наборах символов (никаких оправданий!)] (Http://www.joelonsoftware.com/articles/Unicode.html). Мы понятия не имеем, какой символ ** кодирует ** вы используете, и, судя по всему, вы тоже. Сначала вам нужно исправить это. – IInspectable

+0

Решение для Windows 7: [http://blooplace.eu/how-to-fix-cyrillic-text-on-windows-7/](http://blooplace.eu/how-to-fix-cyrillic-text- on-windows-7 /) – Rotem

+2

@Rotem: Это «решение» просто скрывает реальную проблему. Это не решает. И OP хорошо знает, что изменение системного языка устранит проблему. Вам нужно понять кодировку символов и какой символ, кодирующий конкретную библиотеку, используется для создания реального решения, которое не зависит от каких-либо случайных внешних условий окружающей среды. – IInspectable

ответ

0

Просто нашли решение.
Я использовал функции MultiByteToWideChar и WideCharToMultiByte для преобразования между std::string и std::wstring всегда с CP_ACP в качестве первого аргумента. Когда я сменил его на CP_UTF8, все прошло хорошо.

Кстати, я также поменял кодировку всех файлов проекта на UTF-8 без спецификации.

@IInspectable, спасибо за помощь

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