C ++错误:转换为执行字符集

时间:2015-05-12 11:56:38

标签: c++ c string

问题在于我试图在ASCII之外打印一些字符,如德语变音字符,'ß'等。这些字符不适合普通的char变量,所以显然我试图将它们放在wchar_t中并用L“.....”初始化字符串。但是每次这个字符串包含上面的字符时,我都会得到上面提到的错误,但是对于ASCII的所有其他字符它都没问题。这也发生在u“....”,U“......”,如果我使用u8“.....”它不会产生错误但会打印垃圾。

所以问题:

  1. 如何从ASCII集外部打印此字符和其他字符?
  2. 这是什么错误,这是什么意思?
  3. 我可以打印字符的唯一方法是通过调用setlocale()将语言环境设置为环境默认值(德语),然后只需创建一个包含此字符的普通数组就不会产生错误并打印没错,这里的问题是为什么!! 我完全不明白为什么现在这样做,因为char类型的大小没有改变所以我不假设这个调用setlocale()改变默认字符集中的字符映射(通常是ASCII)。
  4. 如果有人可以对主题字符集以及如何在C ++和C中处理它们进行更多解释,那么我会特别感谢UTF-8,16,32(你没有必要自己写一下,即使其他一些组织良好,相对容易理解的网站,更加彻底地解决这个问题非常受欢迎。)
  5. 请求示例:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        wstring x = L"öäüß" ;
    
        wcout << x ;
    
        return 0 ;
    }
    

    这会打印错误。

    #include <iostream>
    #include <string>
    #include <locale>
    
    using namespace std;
    
    int main(void)
    {
    
        setlocale(LC_ALL,""); // sets locale to german on my computer
        string x = "äöüß" ;
    
        cout << x ;
    
        return 0 ;
    }
    

    这很正常。 但即使在更改区域设置后,如果我创建第一个代码,也会生成错误。

    注意:我注意到在C ++(而不是C)中,即使不包含除iostream之外的任何文件,其他文件的所有内容(如字符串或语言环境或标准库中的任何其他内容)都是在std命名空间中声明的。我暂时忽略了这一点,仍然包含文档文件,但为什么会发生这种情况。 (我使用的是tdm-gcc 64bit)

1 个答案:

答案 0 :(得分:2)

在编译最初在Visual Studio中编辑的多平台项目时,我也遇到了这个问题。 VS使用不同的字符集(CP1252,至少在我的情况下),而GCC期望UTF-8。您可以使用-finput-charset g ++标志来指示源代码的编码。