Verwenden von Funktionen ohne Unicode-Entsprechungen
Funktionen, die nicht mit einer Unicode-Version implementiert wurden, wurden in der Regel durch leistungsfähigere oder erweiterte Funktionen ersetzt, die Unicode unterstützen. Wenn Sie beispielsweise Code portieren, der die OpenFile-Funktion aufruft, kann Ihre Anwendung Unicode unterstützen, indem sie stattdessen die CreateFile-Funktion verwendet.
Wenn eine Funktion über keine Unicode-Entsprechung verfügt, kann die Anwendung Zeichen vor und nach dem Funktionsaufruf 8-Bit-Zeichensätzen zuordnen. Beispielsweise verwenden die Zahlenformatierungsfunktionen atoi und itoa nur die Ziffern 0 bis 9. Normalerweise führt das Zuordnen von Unicode zu 8-Bit-Zeichen zu Datenverlusten. Dies kann jedoch vermieden werden, indem der Codetyp unabhängig und die Ausdrücke bedingt werden. Die Anweisungen im folgenden Beispiel, die für 8-Bit-Zeichen geschrieben wurden, sind typabhängig und sollten zur Unterstützung von Unicode geändert werden.
char str[4] = "137";
int num = atoi(str);
Diese Anweisungen können wie folgt umgeschrieben werden, um sie typunabhängig zu machen.
TCHAR tstr[4] = TEXT("137");
#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
// room for the multibyte characters if they are two
// bytes long and a terminating null character. See Security
// Alert below.
wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);
#else
int num = atoi(tstr);
#endif
In diesem Beispiel übersetzt die C-Standardbibliotheksfunktion wcstombs Unicode in ASCII. Das Beispiel basiert auf der Tatsache, dass die Ziffern 0 bis 9 immer aus Unicode in ASCII übersetzt werden können, auch wenn ein Teil des umgebenden Texts dies nicht kann. Die atoi-Funktion hält an jedem Zeichen an, das keine Ziffer ist.
Ihre Anwendung kann die LCMapString-Funktion (National Language Support, NLS) verwenden, um Text zu verarbeiten, der die nativen Ziffern enthält, die für einige der Skripts in Unicode bereitgestellt werden.
Achtung
Die falsche Verwendung der wcstombs-Funktion kann die Sicherheit Ihrer Anwendung gefährden. Stellen Sie sicher, dass der Anwendungspuffer für die Zeichenfolge mit 8-Bit-Zeichen mindestens die Größe 2 * _ (Zeichenlänge +1) hat, wobei char _ length die Länge der Unicode-Zeichenfolge darstellt. Diese Einschränkung wird vorgenommen, da bei Doppel-Byte-Zeichensätzen (DBCSs) jedes Unicode-Zeichen zwei aufeinanderfolgenden 8-Bit-Zeichen zugeordnet werden kann. Wenn der Puffer nicht die gesamte Zeichenfolge enthält, wird die Ergebniszeichenfolge nicht mit NULL beendet, was ein Sicherheitsrisiko darstellt. Weitere Informationen zur Anwendungssicherheit finden Sie unter Sicherheitsüberlegungen: Internationale Features.