Konvertierung WideChar <-> MultiByte



  • Hallo zusammen,

    weiß jemand, warum diese Konvertierung nicht funktioniert? Ich habe einen kyrillischen Text, den ich anhand der Windows CodePage 1251 (ANSI Cyrillic) in einen MultiByte String konvertieren möchte. Aus unerfindlichen Gründen wird die hochgestellte 2 (²) zu einem '?' kodiert.
    Hier der Quelltext:

    #include <string>
    #include "windows.h"
    
    UINT const CodePage = 1251; // WINDOWS-1251, ANSI Cyrillic
    
    std::wstring to_std_wstring( std::string const& s )
    {
       int const source_length = s.length();
       if( source_length > 0 )
       {
          int const wchars_needed = ::MultiByteToWideChar( CodePage, MB_PRECOMPOSED, &s[0], source_length, nullptr, 0 );
          if( wchars_needed > 0 )
          {
             std::wstring retval( wchars_needed, L'?' );
             int const wchars_copied = ::MultiByteToWideChar( CodePage, MB_PRECOMPOSED, &s[0], source_length, &retval[0], wchars_needed );
             return retval;
          }
       }
       return std::wstring();
    }
    
    std::string to_std_string( std::wstring const& ws )
    {
       static DWORD const ConversionFlags = WC_NO_BEST_FIT_CHARS | WC_COMPOSITECHECK | WC_DEFAULTCHAR;
    
       int const source_length = ws.length();
       if( source_length > 0 )
       {
          int const chars_needed = ::WideCharToMultiByte( CodePage, ConversionFlags, &ws[0], source_length, nullptr, 0, nullptr, nullptr );
          if( chars_needed > 0 )
          {
             std::string retval( chars_needed, '?' );
             int const chars_copied = ::WideCharToMultiByte( CodePage, ConversionFlags, &ws[0], source_length, &retval[0], chars_needed, nullptr, nullptr );
             return retval;
          }
       }
       return std::string();
    }
    
    int main()
    {
       std::wstring const w1 = L"мм²";
       std::string const  s1 = to_std_string( w1 );   // wird "mm?", warum nicht "mm²" ?
       std::wstring const w2 = to_std_wstring( s1 );  // wird "mm?", ist klar, weil s1 ja schon "mm?" ist
    }
    

    Ich verstehe nicht, warum die ² Probleme macht, die sollte doch anhand der CodePage 1251 kodiert werden können.

    PS:
    CodePage 866 (OEM Cyrillic) funktioniert ebenfalls nicht



  • s.data() sollte wohl da besser passen statt &s[0] dann hast du definitiv nen pointer auf den beginn des string arrays



  • Ja, aber das ist auch nur Kosmetik und ändert nichts am Verhalten. Seit C++11 muss der interne String-Speicher zusammenhängend sein, also ist &s[0] auch gültig.



  • @DocShoe
    Wie kommst du auf das Zeichen hochgestellte 2?

    Unter der Codepage 1252 ist das Zeichen als 0xB2 kodiert. In der Codepage 1251 finde ich das Zeichen nicht.

    Bist du sicher das dein String in Codepage 1251 gespeichert ist und nicht als UTF8?

    Wie sieht die Hexrepräsentation aus?



  • @DocShoe sagte in Konvertierung WideChar <-> MultiByte:

    Ich verstehe nicht, warum die ² Probleme macht, die sollte doch anhand der CodePage 1251 kodiert werden können.

    Welcher Code aus 1251 sollte das deiner Meinung nach denn sein?

    https://en.wikipedia.org/wiki/Windows-1251

    Ich sehe da ² nur in der Variante die von Amiga-OS verwendet wird. Windows-1251 hat wohl einfach kein ².



  • Dieser Beitrag wurde gelöscht!


  • @hustbaer sagte in Konvertierung WideChar <-> MultiByte:

    @DocShoe sagte in Konvertierung WideChar <-> MultiByte:

    Ich verstehe nicht, warum die ² Probleme macht, die sollte doch anhand der CodePage 1251 kodiert werden können.

    Welcher Code aus 1251 sollte das deiner Meinung nach denn sein?

    https://en.wikipedia.org/wiki/Windows-1251

    Ich sehe da ² nur in der Variante die von Amiga-OS verwendet wird. Windows-1251 hat wohl einfach kein ².

    Heilige Sch...,

    in kyrillisch gibt´s tatsächlich keine hochgestellte 2 und auch kein mü (µ). Puuh... das wird heikel.



  • @DocShoe sagte in Konvertierung WideChar <-> MultiByte:

    auch kein mü (µ). Puuh

    Du meinst wohl Püüh 😆



  • @hustbaer
    Sehr gut 🤣


Anmelden zum Antworten