Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

OEM to Widechar

21 views
Skip to first unread message

Claus Henning

unread,
Oct 9, 2006, 3:07:16 AM10/9/06
to
Moin zusammen,

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

Martin Richter [MVP]

unread,
Oct 9, 2006, 3:24:37 AM10/9/06
to
Hallo 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

Claus Henning

unread,
Oct 9, 2006, 3:48:32 AM10/9/06
to
Martin Richter [MVP] schrieb/wrote:

> Hallo Claus!
>
>> 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?
>
> CString kann das nicht. Aber es gibt eine entsprechende Win32 Funktion
> OemToChar die einen Unicode String zurück liefert (genau: in einen
> LPTSTR umwandelt).

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

Andre Stille

unread,
Oct 9, 2006, 4:10:16 AM10/9/06
to
Hallo!

"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

Martin Richter [MVP]

unread,
Oct 9, 2006, 4:34:59 AM10/9/06
to
Hallo Claus!

> Danke!

Auch danke! Gern geschehen...

Karsten Schulz

unread,
Oct 9, 2006, 1:11:14 PM10/9/06
to
#include <afxtempl.h>
#include <atlbase.h>
#include <comdef.h>
#include <atlcom.h>


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

Martin Richter [MVP]

unread,
Oct 9, 2006, 5:21:43 PM10/9/06
to
Hallo Karsten!

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

0 new messages