Unicode und Dateien



  • sorry, ich wollte wissen, wie man Unicode Zeichen in eine Datei Schreibt/eine Unicode Datei ausliest/durchsucht u.ä.
    mit fopen & co. geht das schlecht. Wie arbeite ich mit Unicode streams?
    Hab hier das gefunden: http://www.codeproject.com/vcpp/stl/upgradingstlappstounicode.asp
    ist aber C++ und STL. Ich hätte lieber C + WinAPI funktionen. (Kann auch ne andere API sein. Hauptsache, ich kann am Ende UNICODE in Dateien schreiben und Auch in meinem Programm verwenden. z.B auch als Programmname im Titelleiste).



  • ..... schrieb:

    WCHAR text[] = "Hallo";
    WriteFile(..., text, lstrlen(text) * sizeof(WCHAR), ..., ...);
    

    Das ist quatsch.

    @Azrael, il Meraz: Wo ist denn Dein Problem ? Du kannst die ganz normale Windows-File-API verwenden, also WriteFile(Ex), ReadFile, etc... . Hier ein kleines Beispiel:

    #define UNICODE
    
    #include <windows.h>
    #include <iostream>
    #include <assert.h>
    
    #ifdef UNICODE
      #define tcout std::wcout
    #else
      #define tcout std::cout
    #endif // UNICODE
    
    int main()
    {
    	using namespace std;
    
    	/* ---------------------------------- */
    	/* Beispiel: Unicode-Datei schreiben: */
    	HANDLE hUnicodeFile = CreateFile(TEXT("demo.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if(hUnicodeFile == INVALID_HANDLE_VALUE)
    	{
    		tcout << TEXT("Error creating the file.") << endl;
    		return (1);
    	}
    
    	TCHAR szFileContent[] =
    		TEXT("This will be the content of the file. ")
    		TEXT("You can add what ever you want - unicode-text as well! ;-)\n\n");
    	DWORD dwBytesWritten = 0;
    	const DWORD dwByteToWrite = lstrlen(szFileContent) * sizeof(szFileContent[0]);
    	if(!WriteFile(hUnicodeFile, szFileContent, dwByteToWrite, &dwBytesWritten, NULL) ||
    	   dwBytesWritten != dwByteToWrite)
    	{
    		tcout << TEXT("Error writing the content to the file.\nThere were ") << dwBytesWritten
    			  << TEXT(" of ") << dwByteToWrite << TEXT(" bytes written to the file.") << endl;
    		CloseHandle(hUnicodeFile);
    		return (2);
    	}
    
    	CloseHandle(hUnicodeFile);
    	tcout << TEXT("\n\tAll write operations were successful!") << endl;
    
    	/* ------------------------------ */
    	/* Beispiel: Unicode-Datei lesen: */
    	hUnicodeFile = CreateFile(TEXT("demo.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if(hUnicodeFile == INVALID_HANDLE_VALUE)
    	{
    		tcout << TEXT("Error opening the file.") << endl;
    		return (3);
    	}
    
    	DWORD dwFileSize = GetFileSize(hUnicodeFile, NULL);
    	if(dwFileSize == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
    	{
    		tcout << TEXT("Error retrieving the file-size.") << endl;
    		CloseHandle(hUnicodeFile);
    		return (4);
    	}
    
    	TCHAR* pszFileContent = NULL;
    	try
    	{
    		// Alternativ kann man auch vorher bestimmen, ob die Datei im UNICODE-Format
    		// abgespeichert wurde (bzw. das sollte man sogar); hier ist das aber kürzer:
    		// malloc/free würde natürlich auch gehen.
    		assert(sizeof(char) == 1);
    		pszFileContent = reinterpret_cast<TCHAR*>(new char[dwFileSize]);
    		// unterschiedliches Verhalten behandlen, manche Compiler
    		// arbeiten mit Exceptions, manche nicht
    		if(pszFileContent == NULL)
    			throw;
    	}
    	catch(...) // std::bad_alloc wäre normalerweise dafür zuständig
    	{
    		tcout << TEXT("Error allocating the needed memory to hold the file content.") << endl;
    		CloseHandle(hUnicodeFile);
    		return (5);
    	}
    
    	DWORD dwBytesRead = 0;
    	if(!ReadFile(hUnicodeFile, static_cast<void*>(pszFileContent), dwFileSize, &dwBytesRead, NULL) ||
    	   dwFileSize != dwBytesRead)
    	{
    		tcout << TEXT("Error reading the file content. There were ") << dwBytesRead << TEXT(" of ")
    			  << dwFileSize << TEXT(" bytes read.") << endl;
    		CloseHandle(hUnicodeFile);
    		delete [] pszFileContent;
    		return (6);
    	}
    	CloseHandle(hUnicodeFile);
    
    	tcout << TEXT("\n\tAll read operations were successful!\n\n") << endl;
    
    	tcout << TEXT("The content of the file is:\n") << endl;
    	tcout << pszFileContent << endl;
    
    	delete [] pszFileContent;
    
    	return (0); // no errors
    }
    


  • oh danke sehr. Genau sowas hab ich doch auch gesucht. Ach ich hätte die funktion im 2ten beitrag googeln sollen. danke nochmal.

    Wie sieht es denn mit Unicode im QC aus? Ich krieg das nicht hin, japanisch in die Titelleiste zu bringen. Also - lpWindowName bei CreateWindowEx meine ich



  • Es gibt entweder die Möglichkeit, wenn Dein Compiler das unterstützt, den Text direkt einzugeben (also entweder über die Tastatur *g*, oder Du kopierst es aus dem einem anderen Programm, zum Beispiel dem Browser, eine gute Website zum Testen^^: http://www.bbc.co.uk/worldservice/languages/ ). Oder Du arbeitest mit Escape-Sequenzen und dem direkten Zeichencode, hier hast Du einen Überblick:
    http://www.codecodex.com/wiki/index.php?title=Escape_sequences



  • also - MSVS 2005 prof. edition müsste das doch eigentlich unterstützen, oder? Ich bekomme nämlich nur rechtecke angezeigt. auch wenn ich darauf hingewiesen werde, die datei in UNICODE zu speichern, und es auch mache. Oder muss man noch irgendwas beachten?



  • Azrael, il Meraz schrieb:

    also - MSVS 2005 prof. edition müsste das doch eigentlich unterstützen, oder? Ich bekomme nämlich nur rechtecke angezeigt. auch wenn ich darauf hingewiesen werde, die datei in UNICODE zu speichern, und es auch mache. Oder muss man noch irgendwas beachten?

    Jupp die IDE ist okay. Du musst noch auf die Schrift achten, wie zeigst Du Dir das denn an -TextOut/DrawText/... ? ... Console ist sowieso übel *g*.



  • rechtecke krieg ich. wenn ich was mit directX schreiben lasse, krieg ich anständiges japanisch. WinAPI zeigt nur rechtecke.



  • Azrael, il Meraz schrieb:

    WinAPI zeigt nur rechtecke.

    Nicht so konkret...



  • CodeFinder schrieb:

    ..... schrieb:

    WCHAR text[] = "Hallo";
    WriteFile(..., text, lstrlen(text) * sizeof(WCHAR), ..., ...);
    

    Das ist quatsch.

    warum? hab nur das L vor dem string vergessen, aber sonst?



  • @......: Joar das meinte ich^^; meine Kritik war etwas bahnbrechend, ich weiß^^, sry 😉 .



  • CodeFinder schrieb:

    Azrael, il Meraz schrieb:

    WinAPI zeigt nur rechtecke.

    Nicht so konkret...

    TCHAR tansuiko[] = TEXT("淡水湖");
    
    ...
    
    CreateWindow(tansuiko, tansuiko, ....); // rechtecke
    
    ...
    
    MessageBox(NULL, TEXT("Süßwassersee"), tansuiko, MB_OK); // Rechtecke
    
    ...
    
    TextOut(hdc, 50,50, tansuiko, lstrlen(tansuiko)); // Rechtecke
    

    also - im QC steht das mit Kanji :
    TCHAR tansuiko[] = TEXT("淡水湖");



  • naja - ist ja nicht so wichtig, aber falls jemand weiß, worans liegen könnte, hätt ich nichts gegen ne Antwort 😛



  • liegt das möglicherweiße an den installierten schriftarten?
    ich meine, dass firefox ( + directX?) mir z.b. auch einige japanische/chinesische schriftzeichen anzeigen kann, ohne dass mir das windows/editor mir anzeigen könnten...



  • Azrael, il Meraz schrieb:

    TCHAR tansuiko[] = TEXT("淡水湖");

    Was sind das denn für Escape-Sequenzen ?
    Die werden mit \ eingeleitet.



  • CodeFinder schrieb:

    Azrael, il Meraz schrieb:

    TCHAR tansuiko[] = TEXT("淡水湖");

    Was sind das denn für Escape-Sequenzen ?
    Die werden mit \ eingeleitet.

    das sind keine escape-sequenzen. das sind kanji. zeigt dir dein browser &#zahl; an?

    auch wenns an schriftarten liegt, bringts mich nicht weiter. ich will ja dass es auch in der titelleiste u.ä richtig angezeigt wird



  • Jo, aber wir Reden hier noch von C/C++ ... verwende mal sicherheitshalber direkte Escape-Sequenzen und die entsprechenden Zeichencodes.

    PS: Das was ich bezgl der Schriftarten angesprochen habe, werde ich nicht nochmal wiederholen 😋 .



  • escape sequenzen liefern auch rechtecke



  • Und? Hast du inzwischen sichergestellt, dass deine Titelleiste eine Schriftart benutzt, die die gewünschten Zeichen überhaupt darstellen kann? Sonst wird das nie was.



  • Du hälst mich offensichtlich für blöd 😛
    MS Mincho ist die Schriftart.



  • Azrael, il Meraz schrieb:

    Du hälst mich offensichtlich für blöd 😛

    Nein. Ich halte dich nur für unfähig, den aktuellen Status deines Problems zu beschreiben.

    MS Mincho ist die Schriftart.

    Und das hast du wie eingestellt?


Anmelden zum Antworten