c++ - g++ unicode 字符 ifstream

标签 c++ linux unicode g++ ifstream

这是一个关于文本输入文件中 unicode 字符的问题。 This discussion was close but not quite the answer 。使用 VS2008 编译并在 Windows 上执行,这些字符在读取时被识别(可能表示为不同的符号,但已读取) - 使用 g++ 编译并在 Linux 上执行,它们显示为空白。

‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ

其余的 Unicode 符号似乎工作正常,我没有检查所有符号,但发现这组符号不起作用。

问题: (1)为什么? (2)有没有解决办法?

void Lexicon::buildMapFromFile(string filename )  //map
{
    ifstream file;
    file.open(filename.c_str(), ifstream::binary);
    string wow, mem, key;
    unsigned int x = 0;

    while(true) {
        getline(file, wow);
        cout << wow << endl;
        if (file.fail()) break; //boilerplate check for error
        while (x < wow.length() ) {
            if (wow[x] == ',') { //look for csv deliniator
                key = mem;
                mem.clear();
                x++; //step over ','
            } else 
                mem += wow[x++];
        }

        //cout << mem << " code " << key << " is " << (key[0] - '€') << " from €" << endl;

        cout << "enter 1 to continue: ";
        while (true) {
            int choice = GetInteger();
            if (choice == 1) break;
        }

        list_map0[key] = mem; //char to string
        list_map1[mem] = key; //string to char
        mem.clear(); //reset memory
        x = 0;//reset index
    }
    //printf("%d\n", list_map0.size());
    file.close();
}

从 csv 文件中读取 unicode 符号,并解析 unicode 符号和关联的字符串。最初我以为代码中有一个错误,但在 this post the review 中发现它很好,我按照问题来处理字符。

测试是cout << wow << endl;

最佳答案

您显示的字符都是 Windows 代码页 1252 中的字符,这些字符在 ISO-8859 1 编码中不存在。这两种编码很相似,因此经常混淆。

如果输入是 CP1252 并且您将其读取为 ISO-8859 1,那么这些字符将被读取为控制字符,并且不会表现为正常的可见字符。

<小时/>

您可能做错了很多事情而导致出现这种情况,但您必须发布更多详细信息才能确定是哪一个。更完整的答案需要了解如何读取数据、如何在内部转换和存储数据、如何测试读取的数据以及输入数据和/或编码。

<小时/>

您显示的代码在读取数据时不进行任何转换,并且注释掉的打印数据的代码是相同的;没有转换。这意味着要打印数据,您只需依赖输入数据对于运行程序的平台来说是正确的。这意味着,例如,如果您在 Windows 的控制台中运行程序,那么您的输入文件需要使用控制台的代码页* 进行编码。

要解决该问题,您可以;确保输入文件与运行程序的特定控制台所需的编码相匹配;或者指定输入编码,读取时转换为已知的内部编码,打印时转换为控制台编码。

*,如果不是,例如,如果控制台为cp437,并且文件为cp1252,则您列出的字符将显示为:éæææææææææ

关于c++ - g++ unicode 字符 ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324433/

相关文章:

c++ - fatal error C1017 : invalid integer constant expression when using "#if (false)"

c++ - 位操作(清除 n 位)

linux - 如何找到与 sbatch 作业相关的进程?

java - 如何在java中创建多行正则表达式-越界异常

c++ - 如何降低最低值?

c++ - 错误 : request for member 'display' in 'square' , 属于非类类型 'GameBoxes::Box<double>()'

c - Windows 和 Linux 操作系统的内存布局有什么不同吗?

regex - 如何使用 zgrep 显示单词列表中所有 x 大小的单词?

javascript - 如何检测 Unicode 字符是否在我的网页上正确显示?

unicode - 如何组合两个 Unicode 符号来创建一个新符号?