DLL调用C ++ Windows之后奇怪的换行问题

问题

我正在使用Visual Studio 2010在C ++上开发32位非托pipe应用程序。请原谅我缺乏Windows知识,因为我通常在* nix上开发。

最初,在我的程序中,我对std :: cout的stream插入操作符的调用工作正常。 例如,以下语句按预期输出:

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表格中找不到打印的符号。 倒o符号是一个单字符字符,看起来像字母“o”,但是黑色的部分是白色的,白色的部分是黑色的(反转的颜色)。 音乐符号是unicode第8个音符。

任何想法,为什么发生这种情况,以及如何解决它? 看来这个DLL搞乱了控制字符(以\开头的字符)是如何输出的。


我到目前为止所尝试过的

我认为这可能是一个地区的问题,因为DLL是来自日本的公司。 但是,DLL调用之后,语言环境仍然是“C”,就像在调用之前一样。 我使用以下来查询区域设置:

 printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) ); 

我也认为这可能是一种奇怪的记忆腐败,但它似乎被(音乐符号)(倒o)replace,而\ t被replace为倒​​钻石符号。 对于所有的控制字符似乎都有一个常规的“用B代替A”模式,这并不表示内存损坏。

最后,我也试过这个:

 std::cout << "blah" << '\r' << '\n'; 

我看到了相同的垃圾字符:

 std::cout << "blah" << std::endl; 

提前感谢任何帮助和见解。

看看是否解决了这个问题:

 #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()); 

并使用它。 我相信这不会是线程安全的。 冲洗可能是'尴尬' – 但它应该工作