使用沒有 Unicode 對等專案的函式
未使用 Unicode 版本實作的函式通常已由支援 Unicode 的更強大或擴充函式取代。 例如,如果您要移植呼叫 OpenFile 函式的程式碼,您的應用程式可以改用 CreateFile 函式來支援 Unicode。
如果函式沒有 Unicode 對等專案,應用程式可以在函式呼叫前後,將字元對應至 8 位字元集和從 8 位字元集。 例如,數位格式函式 atoi , itoa 只會使用數位 0 到 9。 一般而言,將 Unicode 對應至 8 位字元會造成資料遺失,但可藉由讓程式碼類型獨立,並讓運算式有條件,以避免發生這種情況。 下列範例中針對 8 位字元所撰寫的語句是類型相依的,而且應該變更為支援 Unicode。
char str[4] = "137";
int num = atoi(str);
您可以依照下列方式重寫這些語句,使其與類型無關。
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
在此範例中,標準 C 程式庫函式 wcstombs 會將 Unicode 轉譯為 ASCII。 此範例依賴數位 0 到 9 的事實,一律可以從 Unicode 轉譯為 ASCII,即使部分周圍文字無法轉譯也一樣。 atoi函式會在不是數位的任何字元停止。
您的應用程式可以使用國家語言支援 (NLS) LCMapString 函式來處理文字,其中包含 Unicode 中某些腳本所提供的 原生數位 。
警告
使用 wcstombs 函式不正確可能會危害應用程式的安全性。 請確定 8 位字元字串的應用程式緩衝區大小至少為 2* (char_length +1) ,其中 char_length 代表 Unicode 字串的長度。 這項限制是因為使用 雙位元組字元集 (DBCS) ,每個 Unicode 字元都可以對應至兩個連續的 8 位字元。 如果緩衝區未保存整個字串,則結果字串不會以 Null 終止,因而造成安全性風險。 如需應用程式安全性的詳細資訊,請參閱 安全性考慮:國際功能。
相關主題