1

- - 请关闭 - -

- - - 编辑 - - - - -

我发现问题出在哪里。我将针对真正的问题开始一个新问题....

----------------------

 


你好,

我的情况

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
4

3 回答 3

1
  1. 使用while( !in )而不是eof变体,更好,看到这个问题

  2. 我假设您使用的是 Windows(因为 Linux 和 Mac 通常具有本机 UTF-8 平台编码,这使您可以忽略其中的大部分内容)。

我要做的是将整个文件读取为chars 并使用我在这个问题wchar_t中的方便函数将其转换为 s :)。

请记住:在 linux(也可能是 mac os x)上,您可以将 UTF-8 流输出到终端并获得正确的字符,在 Windows 中,这是一个完全不同的故事。

于 2010-08-14T14:52:01.570 回答
0

如果您不必使用 STL 容器,我建议使用 Qt 框架。Qt 按标准使用 unicode。此外,这些课程设计得非常好,使用起来感觉非常好。

你可以创建一个QTextStream来做你想做的事情。

我认为以下代码应该可以。

QHash<QChar, Glyph*> glyph_map;

QFile data("input.txt");
if (!data.open(QFile::ReadOnly) {
  // handle error and return...
}

QTextStream in(&data);

while (!in.atEnd()) {
  QChar c;
  in >> c;
  // do stuff with your Glyph
  glyph_map[c] = glyph;
}
于 2010-08-14T14:58:02.470 回答
0

不幸的是,这里有点缺乏 C++ - wifstream 中的 w 指的是正在使用的类型,而不是处理带有宽字符的文件的能力。您必须自己进行一些编码,但您可以在以下位置找到食谱:

  1. 使用 C++ 流读取 UTF-8
  2. 升级基于 STL 的应用程序以使用 Unicode
于 2010-08-14T14:45:22.267 回答