【问题标题】:How to read correctly european characters (from file and command shell) in C++?如何在 C++ 中正确读取欧洲字符(来自文件和命令 shell)?
【发布时间】:2015-03-21 12:21:12
【问题描述】:

在我的程序中,我正在使用 ifstream 读取一个文本文件,以便使用 stringstream 读取每一行(使用 getline 进行标记化)打开它;当我得到一个欧洲字符时,比如“è”,它用“├¿”保存这个字符,这可以按预期工作,因为我使用的是字符串而不是 wstring。 但是当我从 cmd 得到一行时(我使用的是 Windows),单词“è”在字符串中被保存为“è”。我的目标是比较从文件和命令 shell 读取的字符串,但如果它们以不同的方式编码,我会被卡住,因为 "è".compare("├¿") 自然是 != 0。我想拥有两者都“错误”或都正确,因为我的目标不是显示它们,而只是计算发生次数。我正在使用最新版本的 Code::Blocks 进行编程,使用 MinGW 32 位和 gcc 4.7.1

更新(代码)

ifstream file;
stringstream stream;

file.open(path);

while( file ){

    while( getline(file,line) ){

        it = 1;
        stream << line;

        if( line.compare("")!=0 ){
            while( getline(stream,token,'\t')) {

                if( it == 1 ){
                    ID = atoi( token.c_str() );
                }
                if( it == 2 ){
                    word = token;

                    if( !case_sensitive ){
                        word = get_lower_case( word );
                    }
                }
                if( it == tags_index ){
                    pos = token;
                }

                it++;
            }

            data.push_back(make_row(ID,word,pos));
        }

        stream.clear();
    }
}

这是我用来读取文件的函数的一部分(我有一个结构来存储列表文件的每个条目,我的问题是“单词”)。

getline(cin,sentence);

[...]

stringstream stream;
string token;
vector<string> tokens;

stream << sentence;
while( getline(stream,token,' ') ){
    tokens.push_back(token);
}
stream.clear();

这就是我在命令外壳中读取输入流的方式。

【问题讨论】:

    标签: c++ string io ascii


    【解决方案1】:

    您可以尝试设置(灌输)语言环境

    #include <iostream>
    #include <locale>
    
    int main()
    {
        auto loc = std::locale("it_IT"); // Example: Italian locale
        std::cin.imbue(loc); // imbue it to input stream, can use a fstream here
        std::cout.imbue(loc); // imbue it to output stream
    
        // rest of the program
    }
    

    【讨论】:

    • 感谢您帮助我。我试图将 sn-p 放在代码的开头,但似乎问题仍然存在;当我比较这两个字符串时,我仍然得到不同的值。
    • @AndreaRomagnoli 您可以尝试将语言环境更改为您使用的语言之一吗?例如,std::locale("it_IT") 我不确定 gcc 对语言环境的支持程度如何,尽管它们在 clang 中工作
    • 我试过了,但它给了我运行时错误;在网上环顾四周,似乎在 Windows 中的 gcc 上只接受“C”和“”。事实上我试过“it_IT”、“it_IT.UTF-8”甚至“en_EN”和“en_EN.UTF-8”都不起作用。
    • @AndreaRomagnoli 是的,在我使用 gcc 的 OS X 上也是如此。虽然clang工作正常,你可以尝试切换编译器bencode.net/blog/2012/10/20/clangonwindows
    • 不知道为什么会这样,可惜我对国际化不太熟悉,也许这里的人会好好回答一下
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2018-12-06
    • 1970-01-01
    • 2011-09-18
    • 2019-10-23
    相关资源
    最近更新 更多