Announcement

Collapse
No announcement yet.

C++ Builder 6: Asiatische Schritzeichen in Datei speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++ Builder 6: Asiatische Schritzeichen in Datei speichern

    Hallo. Gibt es eine Möglichkeit im C++ Builder einen asiatischen Text in eine Datei zu schreiben und wenn ja, wie? Ich scheitere da an jeder Ecke, weil allein wenn ich nur den Text "こんにちはベンジャミン" in den Sourcecode kopieren will, er daraus direkt nur Fragezeichen macht (ist das nur ein Anzeigeproblem oder gehen auch die bit-daten verloren?).

    Ich dachte ich könnte eventuell System::UnicodeString benutzen (http://docs.embarcadero.com/products...odeString.html), aber mein C++ Builder scheint das Element nicht zu erkennen.

    Code:
    #include <ustring.h>
    [...]
    System::UnicodeString mystring = "???????????";
    Das gibt mir sowohl den Fehler, dass er ustring.h nicht öffnen kann als auch, dass UnicodeString kein Element von System ist (wenn ich System weglassen sagt er dass UnicodeString undefiniert ist).

    Irgendeine Ahnung wie ich die Problematik angehen kann oder hat eventuell ein Beispiel wo sowas mal gelöst wurde? Es würde mir reichen einen asiatischen Text aus einer nvarchar Spalte einer Datenbank in eine Datei zu schreiben (also ich muss den Text nicht unbedingt in den Editor pasten).

  • #2
    Kleine Ergänzung:
    Ich schaffe es asiatische Zeichen in eine Datei zu schreiben wenn ich einfach mit short-Werten arbeite:
    Code:
    	FILE *FSave;
    	unsigned short ch = 0;
    
    	if( SaveDialog1->Execute() )
    	{
    		FSave = fopen(SaveDialog1->FileName.c_str(), "w");
    
    		if( FSave == NULL )
    		{
    			ShowMessage("The file could not be opened");
    			return;
    		}
    
    		ch = 50504;
    		fwrite(&ch, 2, 1, FSave);
    		ch = 45397;
    		fwrite(&ch, 2, 1, FSave);
    		ch = 32;
    		fwrite(&ch, 2, 1, FSave);
    		ch = 48180;
    		fwrite(&ch, 2, 1, FSave);
    		ch = 50556;
    		fwrite(&ch, 2, 1, FSave);
    		ch = 48124;
    		fwrite(&ch, 2, 1, FSave);
    	}
    
    	fclose(FSave);
    Wenn ich es so lösen wollte wäre aber noch die Frage wie ich den Inhalt der nvarchar Spalte aus der Datenbank als ein short-Array bekomme.

    Comment


    • #3
      Versuche dann mal mit wchar_t Typ zu arbeiten...

      Dann würde ich das in 2 Schritten realisieren:

      Erstmal schreiben und lesen eines asiatischen String in eine Datei und wenn das geht den String aus der DB lesen. Dann über ggf. erforderliche Konvertierung nachdenken. Die DB müsste ja im Datentyp nvarchar berücksichtigen, wieviel Byte ein Zeichen einnimmt. Oracle tut das m.E. https://docs.oracle.com/html/A96524_...atyp.htm#14968
      Zuletzt editiert von Christian Marquardt; 18.08.2015, 10:55.
      Christian

      Comment


      • #4
        Danke für die Rückmeldung. Ich glaub ich komme jetzt an einer Stelle nicht mehr ganz weiter, was vermutlich durch mein mangelndes Wissen was Filestreams angeht bedingt ist, mein Code sieht jetzt wie folgt aus:
        Code:
        void __fastcall TAsiaForm::Button1Click(TObject *Sender)
        {
        	FILE *FSave;
        	wchar_t ch = 0;
        
        	ADOQuery1->Open();
        	if(ADOQuery1->Active && ADOQuery1->RecordCount > 0) {
        		if( SaveDialog1->Execute() )
        		{
        			FSave = fopen(SaveDialog1->FileName.c_str(), "w");
        
        			if( FSave == NULL )
        			{
        				ShowMessage("The file could not be opened");
        				return;
        			}
        
        			//For some reason it only saves the file in unicode format if you manually write this in
        			ch = 65279;
        			fwrite(&ch, 2, 1, FSave);
        
        			ADOQuery1->First();
        			while(!ADOQuery1->Eof) {
        				ch = (wchar_t)ADOQuery1->FieldByName("UnicodeCh")->AsInteger;
        				fwrite(&ch, 2, 1, FSave);
        				ADOQuery1->Next();
        			}
        
        			fclose(FSave);
        		}
        	}
        }
        Auf Datenbankseite hab ich es schon gelöst indem ich jedes Zeichen einzeln in eine Tabelle speichere als Zahlenwert (über die UNICODE Funktion), diese kann ich dann mit "AsInteger" auch auf den von dir vorgeschlagen wchar_t Typ setzen. Das ist also kein Problem.

        Wo ich jetzt scheitere, ist, dass ich keine neue Zeile in der Datei anfangen kann. Denn wenn ich den Unicode "10" über fwrite speichern will, schreibt er stattdessen Hexadezimal einfach "0D0A00" in die Datei, was bei Unicode natürlich komplett alles durcheinander bringt (da 3 byte anstatt 2). Kann ich das Problem irgendwie umgehen?

        Das andere Problem ist, dass wenn ich die Datei so schreibe, ich alles über Unicode-Zahlen speichern muss (weil er sonst immer davon ausgeht es wäre 8-bit basiert), ich würde aber gerne wann auch immer es mit einem String geht diesen auch einfach verwenden.

        Also ich stelle mir das etwa so vor:
        fwrite("Es folgt ein japanisches Zeichen: ");
        fwrite(12371);
        Geht das irgendwie?

        Ich brauch irgendwie mal ein Beispiel in dieser Art, den Rest könnte ich mir dann sicherlich selbst zusammenreimen.

        Comment


        • #5
          Kann leider kein Beispiel liefern. Den C++Builder schon lange ad acta gelegt.
          Christian

          Comment


          • #6
            Normaler C++ Code wäre auch schon was, der sollte ja auch im Builder gehen.

            Ich hab das Newline Problem jetzt aber glücklicherweise gelöst, man muss den Dateistream als Binär öffnen, dann macht er solche komischen Konvertierungen nicht mehr automatisch.

            Also:
            Code:
            FSave = fopen(SaveDialog1->FileName.c_str(), "wb");

            Comment


            • #7
              Jetzt hat sich ein neues Problem ergeben. Wenn ich es so löse, dann ist die resultierende Datei im UTF-16 Format. Sie soll aber im UTF-8 Format sein. Der SQL Server bietet aber leider keine Funktion mit ein Zeichen als UTF-8 code zu geben (die UNICODE() Funktion gibt den UTF-16 Code zurück). Gibt es irgendeine Möglichkeit den Zahlenwert in UTF-8 umzurechnen?

              Comment

              Working...
              X