char in wchar_t konvertieren



  • Ich suche jetzt schon seit Stunden nach einer Lösung für folgendes Problem:

    Mit einer Zählschleife möchte ich einem Char-Array alle Zeichen der Codepage 437 zuordnen.

    int i;
    char Text[256];
    for (i=0;i<=255;i++)
    {
        Text[i] = i;
    }
    

    Nun möchte ich diese Zeichen in wchar_t überführen.

    wchar_t Text_t[255]
    for (i=0;i<=255;i++)
    {
        Text_t[i] = Text[i];
    }
    

    Mein Problem ist nun, dass es zu vollkommen unterschiedlichen Ausgaben kommt, wenn ich folgendes mache:

    //Ausgabe des Char-Arrays in einem Textfeld:
    System::String buffer
    int(i=0;i<=255;i++)
    {
        sprintf_s(buff,sizeof(buff),"%c\n",Text[i]);
        buffer = gcnew System::String(buff);
        Textfeld1->Text::set(Textfeld1->Text::get()+buffer);
    
    }
    
    //Ausgabe des wchar_t-Arrays in einem Textfeld:
    
    int(i=0;i<=255;i++)
    {
        buffer = gcnew System::String(Text_t[i].ToString(Text_t[i]));
        Textfeld1->Text::set(Textfeld1->Text::get()+buffer);
    }
    

    Kann mir jemand sagen, wie ich es "richtig" machen kann?



  • GR-Thunderstorm schrieb:

    Kann mir jemand sagen, wie ich es "richtig" machen kann?

    in dem du schon mal im richtigen Forum Postest, denn was du da machst ist kein MFC sondern eher CLI/.net und wie ich das sehe versuchst du einfach das gefüllte char array zeichenweise in das wchar_t- Array zu kopieren was irgendwie nicht gehen kann, man beachte wieder den unterschied zwichen char (8bit) und wchar(16bit), also kann das so einfach wie du das versuchst nicht gehen



  • Naja, du musst schon irgendwo die Codepage angeben, sonst kann das ja nix werden.

    Oder du kopierst/schreibst dir irgendwo nen Lookup-Table raus und übersetzt es mit dem selbst.
    CP 437 ist ja netterweise single-byte, von daher geht das.



  • Schau mal in den Namespace System::Text::Encoding



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hustbaer schrieb:

    Naja, du musst schon irgendwo die Codepage angeben, sonst kann das ja nix werden.

    Gibt es dafür irgendeinen Codebefehl? Die Hilfe von VC++ hilft mir nicht wirklich weiter.

    Edit: Ist das mit der Look-Up-Table so gemeint?

    wchar_t IntToWChar_t(int Code437)
    {
    	while (Code437>256)
    	{
    		Code437-=257;
    	}
    
    	const char Hochkomma = 39;
    	const char Backslash = 92;
    
    	switch (Code437)
    	{
    		case 1: return L'€'; //kommt in der Originalcodepage nicht vor
    		case 2: return L'☺';
    		case 3: return L'☻';
    		case 4: return L'♥';
    		case 5: return L'♦';
    		case 6: return L'♣';
    		case 7: return L'♠';
    		case 8: return L'•';
    		case 9: return L'◘';
    		case 10: return L'○';
    		case 11: return L'◙';
    		case 12: return L'♂';
    		case 13: return L'♀';
    		case 14: return L'♪';
    		case 15: return L'♫';
    		case 16: return L'☼';
    		case 17: return L'►';
    		case 18: return L'◄';
    		case 19: return L'↕';
    		case 20: return L'‼';
    		case 21: return L'¶';
    		case 22: return L'§';
    		case 23: return L'▬';
    		case 24: return L'↨';
    		case 25: return L'↑';
    		case 26: return L'↓';
    		case 27: return L'→';
    		case 28: return L'←';
    		case 29: return L'∟';
    		case 30: return L'↔';
    		case 31: return L'▲';
    		case 32: return L'▼';
    		case 33: return Hochkomma;
    		case 34: return L'!';
    		case 35: return L'"';
    		case 36: return L'#';
    		case 37: return L'$';
    		case 38: return L'%';
    		case 39: return L'&';
    		case 40: return L'';
    		case 41: return L'(';
    		case 42: return L')';
    		case 43: return L'*';
    		case 44: return L'+';
    		case 45: return L',';
    		case 46: return L'-';
    		case 47: return L'.';
    		case 48: return L'/';
    		case 49: return L'0';
    		case 50: return L'1';
    		case 51: return L'2';
    		case 52: return L'3';
    		case 53: return L'4';
    		case 54: return L'5';
    		case 55: return L'6';
    		case 56: return L'7';
    		case 57: return L'8';
    		case 58: return L'9';
    		case 59: return L':';
    		case 60: return L';';
    		case 61: return L'<';
    		case 62: return L'=';
    		case 63: return L'>';
    		case 64: return L'?';
    		case 65: return L'@';
    		case 66: return L'A';
    		case 67: return L'B';
    		case 68: return L'C';
    		case 69: return L'D';
    		case 70: return L'E';
    		case 71: return L'F';
    		case 72: return L'G';
    		case 73: return L'H';
    		case 74: return L'I';
    		case 75: return L'J';
    		case 76: return L'K';
    		case 77: return L'L';
    		case 78: return L'M';
    		case 79: return L'N';
    		case 80: return L'O';
    		case 81: return L'P';
    		case 82: return L'Q';
    		case 83: return L'R';
    		case 84: return L'S';
    		case 85: return L'T';
    		case 86: return L'U';
    		case 87: return L'V';
    		case 88: return L'W';
    		case 89: return L'X';
    		case 90: return L'Y';
    		case 91: return L'Z';
    		case 92: return L'[';
    		case 93: return Backslash;
    		case 94: return L']';
    		case 95: return L'^';
    		case 96: return L'_';
    		case 97: return L'`';
    		case 98: return L'a';
    		case 99: return L'b';
    		case 100: return L'c';
    		case 101: return L'd';
    		case 102: return L'e';
    		case 103: return L'f';
    		case 104: return L'g';
    		case 105: return L'h';
    		case 106: return L'i';
    		case 107: return L'j';
    		case 108: return L'k';
    		case 109: return L'l';
    		case 110: return L'm';
    		case 111: return L'n';
    		case 112: return L'o';
    		case 113: return L'p';
    		case 114: return L'q';
    		case 115: return L'r';
    		case 116: return L's';
    		case 117: return L't';
    		case 118: return L'u';
    		case 119: return L'v';
    		case 120: return L'w';
    		case 121: return L'x';
    		case 122: return L'y';
    		case 123: return L'z';
    		case 124: return L'{';
    		case 125: return L'|';
    		case 126: return L'}';
    		case 127: return L'~';
    		case 128: return L'⌂';
    		case 129: return L'Ç';
    		case 130: return L'ü';
    		case 131: return L'é';
    		case 132: return L'â';
    		case 133: return L'ä';
    		case 134: return L'à';
    		case 135: return L'å';
    		case 136: return L'ç';
    		case 137: return L'ê';
    		case 138: return L'ë';
    		case 139: return L'è';
    		case 140: return L'ï';
    		case 141: return L'î';
    		case 142: return L'ì';
    		case 143: return L'Ä';
    		case 144: return L'Å';
    		case 145: return L'É';
    		case 146: return L'æ';
    		case 147: return L'Æ';
    		case 148: return L'ô';
    		case 149: return L'ö';
    		case 150: return L'ò';
    		case 151: return L'û';
    		case 152: return L'ù';
    		case 153: return L'ÿ';
    		case 154: return L'Ö';
    		case 155: return L'Ü';
    		case 156: return L'¢';
    		case 157: return L'£';
    		case 158: return L'¥';
    		case 159: return L'₧';
    		case 160: return L'ƒ';
    		case 161: return L'á';
    		case 162: return L'í';
    		case 163: return L'ó';
    		case 164: return L'ú';
    		case 165: return L'ñ';
    		case 166: return L'Ñ';
    		case 167: return L'ª';
    		case 168: return L'º';
    		case 169: return L'¿';
    		case 170: return L'⌐';
    		case 171: return L'¬';
    		case 172: return L'½';
    		case 173: return L'¼';
    		case 174: return L'¡';
    		case 175: return L'«';
    		case 176: return L'»';
    		case 177: return L'░';
    		case 178: return L'▒';
    		case 179: return L'▓';
    		case 180: return L'│';
    		case 181: return L'┤';
    		case 182: return L'╡';
    		case 183: return L'╢';
    		case 184: return L'╖';
    		case 185: return L'╕';
    		case 186: return L'╣';
    		case 187: return L'║';
    		case 188: return L'╗';
    		case 189: return L'╝';
    		case 190: return L'╜';
    		case 191: return L'╛';
    		case 192: return L'┐';
    		case 193: return L'└';
    		case 194: return L'┴';
    		case 195: return L'┬';
    		case 196: return L'├';
    		case 197: return L'─';
    		case 198: return L'┼';
    		case 199: return L'╞';
    		case 200: return L'╟';
    		case 201: return L'╚';
    		case 202: return L'╔';
    		case 203: return L'╩';
    		case 204: return L'╦';
    		case 205: return L'╠';
    		case 206: return L'═';
    		case 207: return L'╬';
    		case 208: return L'╧';
    		case 209: return L'╨';
    		case 210: return L'╤';
    		case 211: return L'╥';
    		case 212: return L'╙';
    		case 213: return L'╘';
    		case 214: return L'╒';
    		case 215: return L'╓';
    		case 216: return L'╫';
    		case 217: return L'╪';
    		case 218: return L'┘';
    		case 219: return L'┌';
    		case 220: return L'█';
    		case 221: return L'▄';
    		case 222: return L'▌';
    		case 223: return L'▐';
    		case 224: return L'▀';
    		case 225: return L'α';
    		case 226: return L'ß';
    		case 227: return L'Γ';
    		case 228: return L'π';
    		case 229: return L'Σ';
    		case 230: return L'σ';
    		case 231: return L'µ';
    		case 232: return L'τ';
    		case 233: return L'Φ';
    		case 234: return L'Θ';
    		case 235: return L'Ω';
    		case 236: return L'δ';
    		case 237: return L'∞';
    		case 238: return L'φ';
    		case 239: return L'ε';
    		case 240: return L'∩';
    		case 241: return L'≡';
    		case 242: return L'±';
    		case 243: return L'≥';
    		case 244: return L'≤';
    		case 245: return L'⌠';
    		case 246: return L'⌡';
    		case 247: return L'÷';
    		case 248: return L'≈';
    		case 249: return L'°';
    		case 250: return L'∙';
    		case 251: return L'·';
    		case 252: return L'√';
    		case 253: return L'ⁿ';
    		case 254: return L'²';
    		case 255: return L'■';
    		case 256: return L' ';
    		default: return 0;
    	}
    }
    

    Das ganze funktioniert überraschend performant. 😮



  • Ja so kann mans auch machen.
    Ich hätte allerdings eher an sowas gedacht:

    static wchar_t const sc_codePage437[256] = {
        L'€', 9786, 9787, ....
        ....
        };
    
    wchar_t IntToWChar_t(int ch)
    {
        return sc_codePage437[ch & 0xFF];
    }
    

    BTW: 8 Bit Character-Codes gehen von 0 bis 255, nicht 256. Deine Schleife

    while (Code437>256) 
         { 
             Code437-=257; 
         }
    

    ist daher auch falsch, müsste > 255 und -= 256 heissen.
    Das & 0xFF in meiner Variante macht übrigens das selbe, ist aber wie ich finde eine Spur eleganter. Und funktioniert noch dazu auch mit negativen Werten.



  • Stimmt, an diese Möglichkeit habe ich nicht gedacht. 🙂
    Danke für eure Hilfe!!


Anmelden zum Antworten