----请关闭----C++:文件,编码和数据类型
------编辑---------
我发现了问题的所在。我要开始为实际问题的新问题....
----------------------
嗨,
我的情况:
Linux (Ubuntu 10.04)
gcc
但它必须是平台无关的
我有一个文本文件(UTF-8),其中包含特殊字符如¥ © ® Ỳ È Ð
。我有一个std::map
我希望有一个数据类型来保存这些特殊字符。目前我正在使用wchar_t
。
然后我必须使用字符串,它可以包含这些字符。现在我正在使用std::wstring
。
我必须阅读那个UTF-8文件。所以,我想使用wifstream
。对于行处理,我使用wstringstream
。
我认为这并不坏,我到目前为止做了什么...如果没有,有什么更好的?
到底哪里出问题了:
当然,我要读该文件。但是,读取这些行会在第一行停留一个特殊的字符。总之这就是我做的:
map<wchar_t, Glyph*> glyphs;
//...
wifstream in(txtFile.c_str());
if (!in.is_open())
{
throw runtime_error("Cannot open font text file!!");
}
wstring line;
while (getline(in, line)) // edit
{
printf("Loading glyph\n");
if (line.length() == 0)
{
continue;
}
wchar_t keyChar = line.at(0);
/* First, put the four floats into the wstringstream */
wstringstream ss(line.substr(2));
/* Now, read them out */
Glyph *g = new Glyph();
ss >> g->x;
ss >> g->y;
ss >> g->w;
ss >> g->h;
glyphs[keyChar] = g;
printf("Glyph `%c` (%d): %f, %f, %f, %f\n", keyChar, keyChar, g->x, g->y, g->w, g->h);
}
所以,问题是:如何用wifstream读取特殊字符的文件?
在此先感谢!
如何文件看起来:
0.000000 0.000000 0.010909 0.200000
A 0.023636 0.000000 0.014545 0.200000
B 0.050909 0.000000 0.014545 0.200000
C 0.078182 0.000000 0.014545 0.200000
D 0.105455 0.000000 0.014545 0.200000
E 0.132727 0.000000 0.014545 0.200000
....
È 0.661818 0.400000 0.014545 0.200000
É 0.689091 0.400000 0.014545 0.200000
Ê 0.716364 0.400000 0.014545 0.200000
Ë 0.743636 0.400000 0.014545 0.200000
Ì 0.770909 0.400000 0.012727 0.200000
Í 0.796364 0.400000 0.012727 0.200000
Î 0.821818 0.400000 0.012727 0.200000
Ï 0.847273 0.400000 0.012727 0.200000
Ð 0.872727 0.400000 0.014545 0.200000
Ñ 0.900000 0.400000 0.014545 0.200000
@Martijn:你应该使用'std :: string'处理并获得UTF-8字符串。 'wchar_t'不方便,也不是跨平台的。您可以使用空格作为分隔符,并将UTF-8字符(1-4个字节宽)存储在'std :: string'中,或者如果您确实需要'char *',则可以使用该空格作为分隔符。 'std :: wifstream'用于读取'wchar_t's(这种类型转换为Linux上的UTF-32和Windows上的UTF-16),而不是UTF-8 – rubenvb 2010-08-14 15:06:28