[英]Strange newline issue after DLL call C++ Windows
我正在使用Visual Studio 2010在Windows上用C ++开发32位非托管应用程序。请原谅我缺乏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表中未找到。 倒置的o符号是单个unicode字符,看起来像字母“ o”,但o的黑色部分是白色,白色部分是黑色(倒置颜色)。 音乐符号是Unicode八音符。
关于为什么发生这种情况以及如何解决的任何想法? 似乎该DLL弄乱了如何输出控制字符(以\\开头的字符)。
我认为这可能是语言环境问题,因为DLL来自一家日本公司。 但是,在DLL调用之后,语言环境仍然是“ C”,就像在调用之前一样。 我使用以下查询语言环境:
printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );
我还认为这可能是某种奇怪的内存损坏,但似乎\\ r \\ n被替换为(音乐符号)(倒置o),而\\ t被替换为反转的菱形符号。 对于所有控制字符,似乎都有一个常规的“ A替换B”模式,这并不表示内存损坏。
最后,我还尝试了以下方法:
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;
}
请查阅该库的文档,无论是否
您也许可以将另一个流与cout相关联
std::ostream cout2;
cout2.rdbuf(std::cout.rdbuf());
并使用它。 我敢肯定那不是线程安全的。 冲洗可能很“尴尬”-但应该可以
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.