Domanda

---- ---- Si prega di chiudere

------ Modifica ---------

Ho trovato dove il problema è. Ho intenzione di iniziare una nuova domanda per il vero problema ....

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


Ciao,

Situazione :

Linux (Ubuntu 10.04)
gcc

Ma deve essere indipendente dalla piattaforma

Ho un file di testo (UTF-8) con i caratteri speciali come ¥ © ® Ỳ È Ð. Ho un std::map dove mi piacerebbe avere un tipo di dati per la chiave per tenere questi caratteri speciali. Attualmente sto usando wchar_t.

Poi devo usare le stringhe, che può contenere questi caratteri. Ora sto utilizzando std::wstring.

Devo leggere quel file UTF-8. Così, ho pensato con un wifstream. E per linea di lavorazione, ho usato wstringstream.

Credo che questo non è male, quello che ho fatto finora ... Se no, cosa è meglio?

Che cosa sta andando male :

Naturalmente, devo leggere quel file. Ma la lettura delle linee ferma alla prima linea con un carattere speciale. In breve questo è quello che ho fatto:

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);

 }

Quindi, la domanda è: Come leggere un file con i caratteri speciali con un wifstream

Grazie in anticipo!

Come gli sguardi di file :

  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
È stato utile?

Soluzione

  1. uso while( !in ) invece della variante eof, è meglio, vedi questa domanda

  2. sto supponendo che si sta utilizzando Windows (come Linux e Mac hanno normalmente nativo codifica UTF-8 piattaforma, che consente di ignorare la maggior parte di questa roba).

Quello che vorrei fare è leggere l'intero file come chars e convertirlo in wchar_t di utilizzare le funzioni a portata di mano in questa domanda da me:).

Ricorda:. Su Linux (e probabilmente mac os x troppo) si può solo uscita un flusso UTF-8 ad un terminale e ottenere i personaggi giusti, in Windows, che è tutta una Kond diversa della storia

Altri suggerimenti

Purtroppo C ++ è un po 'carente qui - il w in wifstream si riferisce ai tipi in uso, piuttosto che la capacità di file maneggiare con caratteri estesi. Dovrete fare un po 'di codifica da soli, ma si possono trovare le ricette all'indirizzo:

  1. lettura UTF-8 con C ++ flussi
  2. Aggiornamento di un'applicazione STL-based per utilizzare Unicode

Se non è necessario utilizzare i contenitori STL, vorrei suggerire utilizzando il framework Qt. Qt utilizza unicode dalla norma. Inoltre, le classi sono molto ben progettato e si sentono veramente buono da usare.

È possibile creare un QTextStream che farà le cose che si desidera .

Credo che il seguente codice dovrebbe fare.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top