这是一个关于文本输入文件中 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/