TEXT in UTF-8 konvertieren (war: MFC Funktion unter Borland C++ Builder zum laufen bringen ??)



  • Hallo zusammen,

    das Problem ist immer noch TEXT in UTF-8 zu konvertieren.

    Nach langem probieren und suchen bin ich auf folgende Funktion gestoßen:

    CString EncodeToUTF8(LPCTSTR szSource)
    {
    	WORD ch;
    
    	BYTE bt1, bt2, bt3, bt4, bt5, bt6;
    
    	int n, nMax = _tcslen(szSource);
    
    	CString sFinal, sTemp;
    
    	for (n = 0; n < nMax; ++n)
    	{
    		ch = (WORD)szSource[n];
    
    		if (ch == _T('='))
    		{
    			sTemp.Format(_T("=%02X"), ch);
    
    			sFinal += sTemp;
    		}
    		else if (ch < 128)
    		{
    			sFinal += szSource[n];
    		}
    		else if (ch <= 2047)
    		{
    			 bt1 = (BYTE)(192 + (ch / 64));
    			 bt2 = (BYTE)(128 + (ch % 64));
    
    			sTemp.Format(_T("=%02X=%02X"), bt1, bt2);
    
    			sFinal += sTemp;
    		}
    		else if (ch <= 65535)
    		{
    			 bt1 = (BYTE)(224 + (ch / 4096));
    			 bt2 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt3 = (BYTE)(128 + (ch % 64));
    
    			sTemp.Format(_T("=%02X=%02X=%02X"), bt1, bt2, bt3);
    
    			sFinal += sTemp;
    		}
    		else if (ch <= 2097151)
    		{
    			 bt1 = (BYTE)(240 + (ch / 262144));
    			 bt2 = (BYTE)(128 + ((ch / 4096) % 64));
    			 bt3 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt4 = (BYTE)(128 + (ch % 64));
    
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4);
    			sFinal += sTemp;
    		}
    		else if (ch <=67108863)
    		{
    			bt1 = (BYTE)(248 + (ch / 16777216));
    			bt2 = (BYTE)(128 + ((ch / 262144) % 64));
    			bt3 = (BYTE)(128 + ((ch / 4096) % 64));
    			bt4 = (BYTE)(128 + ((ch / 64) % 64));
    			bt5 = (BYTE)(128 + (ch % 64));
    
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5);
    			sFinal += sTemp;
    		}
    		else if (ch <=2147483647)
    		{
    			 bt1 = (BYTE)(252 + (ch / 1073741824));
    			 bt2 = (BYTE)(128 + ((ch / 16777216) % 64));
    			 bt3 = (BYTE)(128 + ((ch / 262144) % 64));
    			 bt4 = (BYTE)(128 + ((ch / 4096) % 64));
    			 bt5 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt6 = (BYTE)(128 + (ch % 64));
    
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5, bt6);
    			sFinal += sTemp;
    		}
    
    	}
    
    	return sFinal;
    

    Leider bin ich zu doof sie im Borland C++ Builder zu implementieren. 🙄

    Kann mir jemand helfen ?
    Oder hat zufällig jemand eine andere Funktion um in UTF-8 zu konvertieren ?

    Danke

    P.S.

    Habe schon die <windows.h> eingebunden,
    habe versucht aus CString Ansistrings zu machen Dann scheitert er an "_T" <-- was macht das ? ist das ein Trimm ??



  • Schaue dir am besten an, was die Methoden der CString Klasse machen. Für fast alle gibt es äquivalente Funktionen der AnsiString Klasse. Damit könntest du dann deine gefundene Funktion auf AnsiString umschreiben.

    Bsp: Die Methode printf der Ansistringklasse dürfte der Format-Methode der CStringklasse entsprechen.



  • warum nimmst du nicht UTF8Encode oder AnsiToUtf8?

    _T wandelt nur die Zeichen in Text um, oder so ähnlich, im BCB müßte es so gehn

    sTemp.Format("=%02x=%02x", ARRAYOFCONST((bt1, bt2)));
    


  • Linnea schrieb:

    warum nimmst du nicht UTF8Encode oder AnsiToUtf8?

    Genau sowas suche ich seid Donnerstag abend 😡 🙄 😋 👍

    und welche header datei brauche ich dafür ??



  • steht eigentlich alles in der BCB-Hilfe...

    [Edit] es gibt auch noch UnicodeToUtf8



  • Ich denke Das Problem liegt daran , dass ich den C Builder 5.0 habe 😡

    *MIST*



  • String EncodeToUTF8(LPCTSTR szSource)
    {
    WORD ch;
    BYTE bt1, bt2, bt3, bt4, bt5, bt6;
    int n, nMax = strlen(szSource);
    String sFinal, sTemp;
    for (n = 0; n < nMax; ++n)
    	{
      ch = (WORD)szSource[n];
      if (ch == '=')
      {
          sTemp = AnsiString().sprintf("=%02X", ch);
          sFinal = sFinal + sTemp;
      }
      else if (ch < 128)
      {
          sFinal = sFinal + szSource[n];
      }
      else if (ch <= 2047)
      {
           bt1 = (BYTE)(192 + (ch / 64));
           bt2 = (BYTE)(128 + (ch % 64));
           sTemp = AnsiString().sprintf("=%02X=%02X", bt1, bt2);
           sFinal = sFinal + sTemp;
      }
      else if (ch <= 65535)
      {
           bt1 = (BYTE)(224 + (ch / 4096)); 
           bt2 = (BYTE)(128 + ((ch / 64) % 64));
           bt3 = (BYTE)(128 + (ch % 64));
           sTemp = AnsiString().sprintf("=%02x=%02x=%02x",bt1, bt2, bt3);
           sFinal = sFinal + sTemp;
      }
      else if (ch <= 2097151)
      {
           bt1 = (BYTE)(240 + (ch / 262144)); 
           bt2 = (BYTE)(128 + ((ch / 4096) % 64));
           bt3 = (BYTE)(128 + ((ch / 64) % 64));
           bt4 = (BYTE)(128 + (ch % 64)); 
           sTemp = AnsiString().sprintf("=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4);
           sFinal = sFinal + sTemp;
      } 
      else if (ch <=67108863)
      { 
          bt1 = (BYTE)(248 + (ch / 16777216));
          bt2 = (BYTE)(128 + ((ch / 262144) % 64));
          bt3 = (BYTE)(128 + ((ch / 4096) % 64)); 
          bt4 = (BYTE)(128 + ((ch / 64) % 64));
          bt5 = (BYTE)(128 + (ch % 64));
          sTemp = AnsiString().sprintf("=%02X=%02X=%02X=%02X=%02X",bt1, bt2, bt3, bt4, bt5);
          sFinal = sFinal + sTemp;
      }
      else if (ch <=2147483647)
      {
           bt1 = (BYTE)(252 + (ch / 1073741824));
           bt2 = (BYTE)(128 + ((ch / 16777216) % 64));
           bt3 = (BYTE)(128 + ((ch / 262144) % 64));
           bt4 = (BYTE)(128 + ((ch / 4096) % 64));
           bt5 = (BYTE)(128 + ((ch / 64) % 64)); 
           bt6 = (BYTE)(128 + (ch % 64));
           sTemp = AnsiString().sprintf("=%02X=%02X=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4, bt5, bt6);
           sFinal = sFinal + sTemp;
      }
    }
    return sFinal;
    }
    

    müsste funktionieren



  • Danke FÜr Deine Hilfe, aber
    wenn ich BÜNZ übergebe bekomme ich
    B=ef=bf=9cNZ raus 😢

    Es müßte aber :
    BÜNZ
    rauskommen.

    😕

    [EDIT] ICh weis auch nicht 100%% was da ab geht 😮
    ICh denke mir nur die "=" kann ich schonmal wegnehmen ?



  • um es zum Abschluß zu bringen:

    Auß der Funktion AnsiToUtf8() (Borland "c++ Builder 6")
    eine *. dll gebaut und die eingebunden ;-).

    Wie gesagt : Ich bin nicht doof ich denke nur ander 🤡

    Danke an alle,


Anmelden zum Antworten