Проблема
Я занимаюсь разработкой 32-разрядного неуправляемого приложения на C ++ для Windows с использованием Visual Studio 2010. Простите, что мне не хватает знаний о Windows, как я обычно работаю на * nix.
Изначально в моей программе мои вызовы оператора вставки потока std :: cout работают нормально. Например, следующий оператор выдает ожидаемый результат:
std::cout << "hello" << std::endl;
Однако следующий код не работает:
std::cout << "\thello" << std::endl;
...call to DLL from Japanese company who won't respond to support requests...
std::cout << "\thello" << std::endl;
Вышеприведенный код печатает:
hello
(символ перевернутого ромба) привет (символ музыки восьмой ноты) (перевернутый символ o)
Как только я впервые вызвал эту DLL, мой вывод в std :: cout навсегда испортился. Печатными символами являются , а не , найденные в таблице ASCII. Инвертированный символ «о» - это один символ Юникода, который выглядит как буква «о», но черная часть «о» - белая, а белая - черная (инвертированные цвета). Музыкальный символ - это 8-ая нота Unicode.
Есть идеи, почему это происходит и как это исправить? Похоже, что эта DLL ломает голову, как выводятся управляющие символы (символы, начинающиеся с \).
Что я пробовал до сих пор
Я подумал, что это может быть языковой вопрос, поскольку DLL принадлежит японской компании. Тем не менее, после вызова DLL локаль по-прежнему "C", как это было до вызова. Я использую следующее для запроса локали:
printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );
Я также думал, что это может быть какое-то странное повреждение памяти, но кажется, что \ r \ n заменяется (музыкальный символ) (инвертированный o), тогда как \ t заменяется инвертированным символом алмаза. Похоже, что для всех контрольных символов существует обычный шаблон «заменить А на В», который не будет указывать на повреждение памяти.
Наконец, я тоже попробовал это:
std::cout << "blah" << '\r' << '\n';
и я вижу одинаковые символы мусора, созданные:
std::cout << "blah" << std::endl;
Заранее благодарим за любую помощь и понимание.