Странная проблема перевода строки после вызова DLL C ++ Windows - PullRequest
2 голосов
/ 21 июня 2011

Проблема

Я занимаюсь разработкой 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;


Заранее благодарим за любую помощь и понимание.

1 Ответ

1 голос
/ 21 июня 2011

Посмотрите, исправляет ли это:

#include <iostream>
#include <locale>

int main()
{
    std::cout << "\thello" << std::endl;
    // ...call to DLL from Japanese company who won't respond to support requests...
    locale mylocale("");  // or "C"     // Construct locale object with the user's default preferences
    std::cout.imbue( mylocale );   // Imbue that locale
    std::cout << "\thello" << std::endl;  
    return 0;
}

Обратитесь к документации для этой библиотеки, если

  1. это изменение локали в соответствии с проектом
  2. настроено иначе

Вы могли бы возможно связать другой поток с cout

std::ostream cout2;
cout2.rdbuf(std::cout.rdbuf());

и использовать его.Я уверен, что это не будет потокобезопасным.Промывка может быть «неловкой», но она должна работать

...