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!!