Freigeben über


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. Die Zahlenformatierungsfunktionen atoi und itoa verwenden beispielsweise nur die Ziffern 0 bis 9. Normalerweise verursacht das Zuordnen von Unicode zu 8-Bit-Zeichen Datenverluste. Dies kann jedoch vermieden werden, indem der Code typunabhängig ist und die Ausdrücke bedingt werden. Die Anweisungen im folgenden Beispiel, die für 8-Bit-Zeichen geschrieben wurden, sind typabhängig und sollten geändert werden, um Unicode zu unterstützen.

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 Standardmäßige C-Bibliotheksfunktion 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 stoppt bei jedem Zeichen, das keine Ziffer ist.

Ihre Anwendung kann die LCMapString-Funktion (National Language Support, 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 beeinträchtigen. Stellen Sie sicher, dass der Anwendungspuffer für die Zeichenfolge mit 8-Bit-Zeichen mindestens die Größe 2*(char_length +1) aufweist, wobei char_length die Länge der Unicode-Zeichenfolge darstellt. Diese Einschränkung wird vorgenommen, weil bei Double-Byte-Zeichensätzen (DBCSs) jedes Unicode-Zeichen zwei aufeinanderfolgenden 8-Bit-Zeichen zugeordnet werden kann. Wenn der Puffer nicht die gesamte Zeichenfolge enthält, ist die Ergebniszeichenfolge nicht null-beendet, was ein Sicherheitsrisiko darstellt. Weitere Informationen zur Anwendungssicherheit finden Sie unter Sicherheitsüberlegungen: Internationale Features.

 

Verwenden von Unicode und Zeichensätzen