Unicode Problem
-
Hallo,
ich versuche in einem Spiel den Namen des Spielers zu zeichnen, was meistens auch gut funktioniert. Nur dann nicht, wenn Sonderzeichen im Namen sind. Also habe ich die Zeichenfunktion auf Unicode umgestellt und meinen Code angepasst:
bool AnsiToUnicode(LPCSTR src, LPWSTR dest) { if(0 == MultiByteToWideChar(CP_ACP,0,src,-1,dest,64)) { return false; } return true; } char name[32]; //wird befüllt wchar_t uname[64]; AnsiToUnicode(name,uname); ZeichneNamen(name);Stimmt das soweit? Weil wenn ich es teste, sieht alles genauso aus wie ohne die Umwandlung.
So siehts aus (mit und ohne Umwandlung):
http://www.abload.de/img/unicode1mqzg.jpg
Und so sollte es aussehen:
http://www.abload.de/img/unicode28s1p.jpgEdit: MultiByteToWideChar failt natürlich nicht
greetz KN4CK3R
-
Du solltest CP_ACP hier nicht verwenden, immer besser mit unicode oder utf8. Wenn der Name ist in einem Editfield, use GetWindowTextW. Wichtig: CreateWindowExW.
-
was sollte ich statt CP_ACP verwenden? Laut MSDN gibs da nur CP_UTF8 was zu deinem Post passen würde.
Die Zeichenfolge bekomme ich nicht aus einem Editfeld, die bekomme ich von einem Server geschickt (als char[32] Array). Problem sind halt bei der Ausgabe die Sonderzeichen. 'ö' wird zB. zu 'ö'.greetz KN4CK3R
-
was sollte ich statt CP_ACP verwenden?
Schau mal:
#include <shlwapi.h> #include <tchar.h> #pragma comment(lib, "shell32") #pragma comment(lib, "shlwapi") char g_username[32]; HANDLE g_hFile; BOOL __stdcall FindValidCodepageCallback(LPTSTR lpCodePageString) { static HANDLE hStdOut; DWORD cp; WCHAR text[64]; LPWSTR textW; _stscanf(lpCodePageString, TEXT("%d"), &cp); textW = &text[swprintf(text, L"%5d: ", cp)]; MultiByteToWideChar(cp, 0, g_username, -1, textW, 64-7); if (wcslen(textW)) { wcscat(text,L"\r\n"); WriteFile(g_hFile, text, wcslen(text)<<1, &cp, 0); } return 1; } int main() { TCHAR path[MAX_PATH]; LPTSTR filename = TEXT("all codepages.txt"); g_hFile = CreateFile(filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); // unicode header WriteFile(g_hFile, "\xFF\xFE", 2, (DWORD*)&path, 0); strcpy(g_username, "\xC3\x9F\xC3\xBC\xC3\xB6\xC3\xA4"); // von einem Server: ßüöä EnumSystemCodePages(FindValidCodepageCallback, CP_SUPPORTED); FlushFileBuffers(g_hFile); CloseHandle(g_hFile); _tcscpy(path, filename); PathFindOnPath(path, NULL); ShellExecute(0, NULL, path, 0, 0, SW_SHOW); }Die "ßüöä" Zeichenkette wird lesbar ganz unten, (nur) neben 65001 (aka CP_UTF8).
-
Sicher das der Server wirklich Ansi schickt und nicht z.B. utf8 ?
-
nein, ich weiß nicht genau was der Server schickt. Ich weiß nur, dass es nicht der Zeichensatz ist, den ich ausgeben möchte.
Edit: habe es gerade mit CP_UTF8 probiert und die Namen werden jetzt richtig angezeigt. Danke an sapero für die Konsolenversion seines Beispiels. Das war anschaulich.

greetz KN4CK3R