ich habe hier (VS2005, MFC) ein Datei, die Strings im OEM-Zeichensatz
enthält. Diese lese ich jeweils in einen Puffer und will sie in einem
CString ablegen. Wenn UNICODE nicht definiert ist, dann kann ich den
String einfach zuweisen und dann CStringA::OemToAnsi() benutzen. Gibt es
für den Fall, dass UNICODE definiert ist, einen ähnlich einfachen Weg;
oder muss ich da explizit über ::MultiByteToWideChar(...) gehen?
Claus
CString kann das nicht. Aber es gibt eine entsprechende Win32 Funktion
OemToChar die einen Unicode String zurück liefert (genau: in einen
LPTSTR umwandelt).
--
Martin Richter [MVP] WWJD
"In C we had to code our own bugs. In C++ we can inherit them."
FAQ : http://www.mpdvc.de
Samples: http://www.codeguru.com http://www.codeproject.com
Hallo Martin,
Prima! Dann brauche ich in meinem Code ja nicht mal zwischen UNICODE und
!UNICODE zu unterscheiden.
Ich muss an dieser Stelle mal ein ganz großes Dankeschön an dich
aussprechen; nicht nur für diese Hilfestellung, sondern für diverse
andere Hinweise, die ich von dir erhalten habe, und nach denen ich mir
teilweise die Finger wund gesucht habe. Im MSDN sieht leider man
manchmal den Wald vor lauter Bäumen nicht. Die Fülle der dort
vorhandenen Information ist leider nicht so strukturiert, dass man die
Lösung einfach finden kann. Aber wozu gibt es eine Newsgroup? Und dort
Leute, die einem kompetent helfen können. Also nochmals: Danke!
Claus
"Claus Henning" <claus#minus#guntram#dot#henning#at#ortim#dot#de> schrieb im
Newsbeitrag news:uYzMIG36...@TK2MSFTNGP04.phx.gbl...
Theoretisch:
Wann immer die CString-Klasse eine Konvertierung zwischen verschiedenen
Zeichensatzen durchführt, holt sie sich über _AtlGetConversionACP die
für die Umwandlung zu benutzende Codepage. _AtlGetConversionACP ruft
dazu über g_pfnGetThreadACP eine Funktion auf und freundlicherweise
ist g_pfnGetThreadACP extern, man könnte also g_pfnGetThreadACP auf
eine eigene Funktion verweisen lassen und so die OEM-Codepage zurück-
geben. Das würde dann aber prozessweit bzw. unter Hilfe von TLS
threadweit gelten.
MfG
Andre Stille
> Danke!
Auch danke! Gern geschehen...
Es geht auch CComBSTR strBstr(_T("ching chang chong"));
CString str(strBstr);
oder sowas:
char *WidthToSingleString(CString str)
{
#ifndef _UNICODE
return str.GetBuffer(0);
#endif
static CHAR m_multibyte[4096];
static WCHAR m_singlebyte[4096];
wcscpy( &m_singlebyte[0],str.GetBuffer(0));
WideCharToMultiByte( CP_ACP,
0,
(LPCWSTR)&m_singlebyte[0],
-1,
&m_multibyte[0],
sizeof(m_multibyte),
NULL,
NULL
);
return &m_multibyte[0];
}
"Claus Henning" <claus#minus#guntram#dot#henning#at#ortim#dot#de> schrieb im
Newsbeitrag news:uYzMIG36...@TK2MSFTNGP04.phx.gbl...
> Es geht auch CComBSTR strBstr(_T("ching chang chong"));
Blödfug. Es geht nicht. Ein OEM Zeichen würde nicht korrekt übersetzt
werden.
Wenn OEM Umlaute (alte DOS Dateien) direkt so konvertiert werden, gehen
die Umlaute hopps!