Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » ifstream: Unicode Code Points vs. Escape Sequenz

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.11.2007, 13:46 Uhr
opensolutionIT



Hallo Zusammen !

Ich bin gerade dabei in c++ via ifstream eine Datei binär zu öffnen. Der Pfad zur Datei besteht aus Sonderzeichen (öäüß usw.). Mit Hilfe eines UTF-16 Converters wandle ich die Sonderzeichen in Unicode Code Points um ( z.B. ä = \u00e4 etc.). Nun da sich die Code Points laufend verändern habe ich das Problem wie ich die Unicode ID zusammenbaue. Nämliche wenn ich die ersten vier Zeichen fest definiere (\u00), kann ich das mit den letzten zwei Zeichen nicht bewerkstelligen, da laufend andere Sonderzeichen bzw. Codepoints das ifstream anlaufen. Nur wenn ich die Komplette Unicode ID in einem Rutsch angebe "\u00e4" bekommt das ifstream das hin die Datei zu öffnen. Was ich aber nicht möchte da die Unicode IDs Variable sein sollen. Mein Compiler(g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux)) sagt mir dann immer "error: incomplete universal character name \u00" wo er ja auch im Prinzip recht hat.
Nur erkennt er nicht das nach dem "\u00" noch eine Variable kommt wo der Rest des Unicode zeichen drin steht. Und wenn ich anstelle von "\u00" "\\u00" schreibe bekommt das ifstream die Datei nicht auf (Pfad nicht gefunden).

Mein eigentliches Problem ist eigentlich nur die Escape Sequenz des "universal charater" veränderbar zu halten und aus zwei verschiedenen Variablen zu einer zusammenzubauen.
Hat jemand eine Idee wie ich das Problem lösen kann ?

Zum besserem Verständnis hier ein Stückchen Code:

C++:
//############################################################################

char unicode_id[] ={"/tmp/\u00"}//Hier ist das eigentliche Problem da der Compiler merkt das, \u00 keine Komplette oder richtige universal character Escape Sequenz ist.
strcat(unicode_id, variable_mit_dem_rest_des_utf-16_codepoints);//Hier wird dann der Rest der Escape Sequenz zusammengebaut. Z.B. "/tmp/\u00" + "e5" in zwei verschiedenen Variablen.
strcat(unicode_id,"datei.txt")

ifstream f;
//f.open("/tmp/\u00e4/datei.txt", ios::binary);//so funktionierts, ist aber nicht gewünscht.
f.open(unicode_id, ios::binary);//So klappts leider nicht bei mir
f.seekg(0, ios::end);
long double gesammt_groesse = 0;
gesammt_groesse = f.tellg();
cout<<"Dateigroesse: "<<gesammt_groesse<<endl;

//############################################################################


Vielen Dank im Voraus
B.-D.


PS: System Infos:
SuSE 10.2 Kenrel 2.6.22.6
g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux)

Dieser Post wurde am 16.11.2007 um 16:01 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.11.2007, 15:30 Uhr
0xdeadbeef
Gott
(Operator)


Benutz doch iconv:

C++:
#include <iconv.h>

// ...

char in[100] = "/tmp/ä/datei.txt", out[100];
char *pin = in, *pout = out;
size_t in_n, out_n = 100;
iconv_t convert;

in_n = strlen(in);

convert = iconv_open("UTF-16//TRANSLIT", "ISO8859-15");

iconv(convert,
      &pin , & in_n,
      &pout, &out_n);

iconv_close(convert);

// out beinhaltet jetzt "/tmp/\u00e4/datei.txt"


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.11.2007 um 15:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: