我正在使用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 char,看起来像字母'o'但是o的黑色部分是白色,而白色部分是黑色(倒置的颜色)。音乐符号是unicode第8个音符。
关于为什么会发生这种情况以及如何解决问题的任何想法?似乎这个DLL搞乱了如何输出控制字符(以\开头的字符)。
我认为这可能是一个区域设置问题,因为DLL来自日本公司。但是,在DLL调用之后,语言环境仍然是“C”,就像在调用之前一样。我使用以下方法查询语言环境:
printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );
我还认为这可能是某种奇怪的内存损坏,但似乎\ r \ n被(音乐符号)(倒o)取代,而\ t被倒置的菱形符号取代。对于所有控制字符,似乎有一个常规的“替换A by B”模式,这不会表示内存损坏。
最后,我也尝试了这个:
std::cout << "blah" << '\r' << '\n';
我看到创建的垃圾字符相同:
std::cout << "blah" << std::endl;
<小时/> 提前感谢您的任何帮助和见解。
答案 0 :(得分:1)
看看这是否解决了这个问题:
#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());
并使用它。我确信这不会是线程安全的。法拉盛可能是“尴尬” - 但它应该工作