다음을 통해 공유


유니코드 등가 항목이 없는 함수 사용

유니코드 버전으로 구현되지 않은 함수는 일반적으로 유니코드 를 지원하는 더 강력하거나 확장된 함수로 대체되었습니다. 예를 들어 OpenFile 함수를 호출하는 코드를 포팅하는 경우 애플리케이션은 CreateFile 함수를 대신 사용하여 유니코드를 지원할 수 있습니다.

함수에 해당하는 유니코드가 없는 경우 애플리케이션은 함수 호출 전후에 8비트 문자 집합에 문자를 매핑할 수 있습니다. 예를 들어 atoiitoa 의 숫자 서식 함수는 0에서 9까지의 숫자만 사용합니다. 일반적으로 유니코드를 8비트 문자에 매핑하면 데이터가 손실되지만 코드 형식을 독립적으로 만들고 식을 조건부로 설정하여 이를 방지할 수 있습니다. 8비트 문자로 작성된 다음 예제의 문은 형식에 따라 달라지며 유니코드를 지원하도록 변경해야 합니다.

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 는 유니코드를 ASCII로 변환합니다. 이 예제에서는 주변 텍스트 중 일부를 사용할 수 없는 경우에도 숫자 0~9를 유니코드에서 ASCII로 항상 변환할 수 있다는 사실에 의존합니다. atoi 함수는 숫자가 아닌 문자에서 중지됩니다.

애플리케이션은 NLS(National Language Support) LCMapString 함수를 사용하여 유니코드의 일부 스크립트에 제공된 네이티브 숫자를 포함하는 텍스트를 처리할 수 있습니다.

주의

wcstombs 함수를 잘못 사용하면 애플리케이션의 보안이 손상됩니다. 8비트 문자 문자열의 애플리케이션 버퍼가 2*(char_length +1) 이상인지 확인합니다. 여기서 char_length 유니코드 문자열의 길이를 나타냅니다. 이 제한은 DBCS( 더블 바이트 문자 집합 )를 사용하여 각 유니코드 문자를 두 개의 연속된 8비트 문자에 매핑할 수 있기 때문입니다. 버퍼에 전체 문자열이 없으면 결과 문자열이 null로 종료되지 않아 보안 위험이 발생합니다. 애플리케이션 보안에 대한 자세한 내용은 보안 고려 사항: 국가별 기능을 참조하세요.

 

유니코드 및 문자 집합 사용