Noch einmal Unicode



  • Hallo NG,

    ich habe eine dringende Bitte:

    Ich versuche eine Unicode-Datei zu erstellen.

    Immer wenn ich genau diese Datei mit dem Programm öffne, mit dem ich sie erstellt habe, dann wird das erste Zeichen "verschluckt".

    Frage:

    Muss bei Unicode-Dateien ein bestimmtes Zeichen als Erstes in die Datei geschrieben werden, ich habe mal so was gehört???

    Vielen Dank.

    Gruß Walter



  • Nöö, was Du meinst, sind BSTR

    CStdioFile müsste das doch eigentlich richtig behandeln!



  • Kann man überhaupt mir CStdioFile::WriteString Unicode Text-Dateien erzeugen?
    Bei mir erzeugt er immer normale 1-Byte-Pro Zeichen Textdateien...

    [ Dieser Beitrag wurde am 20.09.2002 um 14:19 Uhr von Nemesyzz editiert. ]



  • Ich versuche das für einen PDA mit Windows Pocket PC zu schreiben.
    Pocket PC unterstützt angeblich NUR Unicode?

    HANDLE hFile;
    
    int x = 0;
    int i = 0;
    DWORD numWrite;
    TCHAR zwTchar;
    CString Zeile = "";
    
    const TCHAR* szFilename1 = SpeichernDateimitPfad;
    
    hFile = CreateFile(szFilename1, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    
    if(hFile == INVALID_HANDLE_VALUE){
            MessageBox(_T("Kann Datei nicht öffnen!"),NULL,MB_OK);}
    
    else{
    
        while(x <= ZeilenCounter){
    
        Zeile = ... ;
            while (i < Zeile.GetLength ()){
                zwTchar = MAKEWORD(Zeile.GetAt(i) ,0);
                WriteFile(hFile,&zwTchar,sizeof(zwTchar),&numWrite,0);
                i++;
            }
            i = 0;
            x++;
        }
    }
    
    CloseHandle(hFile);
    

    Beim Öffnen wird daher ein "Unicode" - Zeichen überprüft:

    HANDLE hFile;
    WORD wLeadin;
    DWORD dwNumRead;
    const TCHAR* szFilename = GeoeffneteDateimitPfad;
    TCHAR szChar[2], zwTchar;
    
    DateiInhalt = "";
    
    hFile = CreateFile(szFilename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    
    if(hFile == INVALID_HANDLE_VALUE){
        MessageBox(TEXT("Invalide File Handle"),NULL,MB_OK);
    }
    
    if(ReadFile(hFile, &wLeadin, 2, &dwNumRead, 0)){
    // Überprüfung auf Unicode:
        if(wLeadin == 0xFEFF){
    
            while(ReadFile(hFile, szChar, sizeof(TCHAR), &dwNumRead, 0) && dwNumRead >0){
                szChar[1] = '\0';
                DateiInhalt = DateiInhalt + szChar[0];
            }
        }
        else{
            MessageBox(TEXT("Kein Unicode"),NULL,MB_OK);
        }
    }
    else{
        MessageBox(TEXT("Kann Datei nicht öffnen"),NULL,MB_OK);
    }
    
    CloseHandle(hFile);
    

    Kann das sein?

    Danke

    Gruß Walter



  • Jo - das könnte sein.
    vlt sogar 0xffff - 0xff00
    Ich tippe mal auf zweiteres

    Wenn du Win2k/xp hast dann öffne mal Regedit und exportier mal irgendwas.
    Das exportierte ist dann in Unicode. Am Anfang war dann immer so ein seltsames Zeichen. Ich glaube mich zu erinnern das das Zweite Ascii 255 war



  • Und wie mache ich das, wenn ich das Startzeichen in die Datei als erstes Zeichen schreiben will?

    Danke!



  • Toll - Du hast ja schon die zwei Zeichen - und ich fahr hier extra nen Win2k-Rechner hoch 🙄...

    Wie du das machen willst?
    Du schreibst einfach als erstes Zeichen 0xfeff



  • Gebe ich das 0xfeff dann in ein z.B. WORD wLeadin; und schreibe das dann als erstes in die Datei?

    Ich weiß dass das eine Dumme Frage ist, aber sie ist ernst gemeint.

    Danke.

    Gruß Walter



  • Du kannst statt dem WORD auch einfach TCHAR nehmen - ist zwar egal - aber es sieht halt besser aus. (Man weiss dann später noch was gemeint ist.)

    Ich hatte das auch mal ausprobiert:

    TCHAR unicodeID = 0xfeff;
    
        CFile file(L"C:\\unicode.txt",CFile::modeCreate|CFile::modeWrite);
    
        file.Write(&unicodeID,sizeof(unicodeID));
        file.Write(L"Hello World!",24);
        file.Close();
    


  • Sorry, noch eine dumme Frage:

    wenn ich meinen Text, den ich in eine Datei schreiben will, in einem CString habe, und diesen dann auf folgende Weise konvertiere, dann werden nur die ersten 2 Zeichen in die datei geschrieben:

    const TCHAR* datei = Zeile;
    file.Write (datei,sizeof(datei));
    

    Ich kann vermutlich das Konvertieren nicht?



  • CString string(L"Hello World!");
        file.Write(string,string.GetLength() * sizeof(TCHAR));
    

    Das funktioniert aber nur so wenn dein Programm in UNICODE geschrieben ist.



  • Vielen Dank,

    das funktioniert so hervorragend.

    Und ich habe wieder sehr viel dazugelernt!!

    Danke noch einmal!

    Gruß Walter


Log in to reply