정보: DBCS 호환 응용 프로그램 쓰기 위한 팁

기술 자료 번역 기술 자료 번역
기술 자료: 75439 - 이 문서가 적용되는 제품 보기.
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
3.00 3.10 WINDOWS kbprg
모두 확대 | 모두 축소

요약

더블바이트 문자 집합 (DBCS) 사용하는 시스템의 문자열 연산을 싱글 바이트 문자 시스템에서 약간 다릅니다. 이 문서에서는 DBCS 시스템 싱글바이트 시스템에 대해 작성된 응용 프로그램 포트 데 필요한 작업 시간을 줄이기 위한 지침을 제공합니다.

추가 정보

더블바이트 문자 집합 일부 한 바이트 필요하지만 일부 문자를 두 바이트 필요합니다. "선행 바이트" 와 일부 문자를 지정하는 의해 문자가 두 가지 유형의 언어 드라이버 구별할 수 있습니다. 선행 바이트가 더블바이트 문자 (DBC) 만들려면 다른 바이트가 ("꼬리 바이트") 와야 합니다. 선행 바이트가 집합을 각 언어마다 다릅니다. 선행 바이트가 항상 확장 문자가 보장되는; 7-비트 ASCII 문자가 선행 바이트가 될 수 있습니다. 꼬리 바이트 NULL 바이트 제외한 모든 바이트 수 있습니다. 문자열 끝에 문자열의 첫 번째 NULL 바이트를 항상 정의됩니다. 선행 바이트가 법적 꼬리 바이트, 컨텍스트에서 바이트가 선행 바이트로 역할을 하는 경우 알 수 있는 유일한 방법은 있습니다.

Windows 소프트웨어 개발 키트 (SDK) 버전 3.0 DBCs 포함된 문자열을 통해 이동하기 위한 두 가지 기능이 포함되어 있습니다: AnsiNext()AnsiPrev(). 이를 통해 문자열 이전 문자로 시작되는 위치를 확인하려면 처음부터 실행해야 하므로 시간이 비싼 호출 AnsiPrev() 함수입니다. 문자열 끝에 대신 시작 문자를 검색하는 데 가장 적합합니다.

Windows SDK 버전 3.1 바이트가 선행 바이트가 BE 수는 경우에만 TRUE를 반환하는 IsDBCSLeadByte() 함수를 포함합니다. 이 함수는 char 때문에 매개 변수, 바이트 (이렇게 컨텍스트 필요합니다) 바이트인지 IS 경우 보고할 수 없습니다.

최대한 빨리 실행할 아닌 DBCS 코드를 만들 수 소스 파일 "# ifdef DBCS" 만 DBCS 코드를 주위에 사용할 및 개체 (OBJ) 파일의 두 버전을 컴파일할 수 있습니다. 예를 들어,:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
DBCS 정의되지 않은 경우 코드를 보다 읽기 쉽게 하려면, 응용 프로그램 AnsiNext()AnsiPrev() 함수에 매크로를 정의할 수:
   #ifndef DBCS

   #define AnsiNext(x) ((x)+1)
   #define AnsiPrev(y, x) ((x)-1)

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
이러한 정의를 사용하여 모든 코드를 DBCS 작성할 수 있습니다. AnsiNext() 함수를 사용하여 문자열의 끝을 지나 이동합니다 및 매크로가 됩니다 동안 AnsiPrev() 함수를 사용하여 문자열의 시작을 지나 이동 유의하십시오. 또한 AnsiPrev() 매크로 "y" 매개 변수는 무시됩니다 때문에 일부 코드 정의된 DBCS 사용하지 않고 컴파일할 때 다른 결과를 제공합니다. 다음 코드에서는 이 전세계적으로 예입니다:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
다음 코드에서는 파일 오프셋의 전체 경로 이름을 찾는 방법을 보여 줍니다:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

    for (lpszFileName = lpszFullPath; *lpszFullPath;
               lpszFullPath = AnsiNext(lpszFullPath))
        if (*lpszFullPath == ':' || *lpszFullPath == '\\')
            lpszFileName = lpszFullPath + 1;

    return lpszFileName;

   }
				
있는 참고 ': '및' \\ ' 선행 바이트가 되도록 보장됩니다. 최종 AnsiPrev() 함수를 사용하지 않는 것이 아니라 문자열의 처음부터 검색을 시작했습니다.

제한된 크기 버퍼 문자열 복사 보여 주는 코드입니다. 문자열의 선행 바이트가 끝 하면 참고.
   int StrCpyN(LPSTR lpszDst, LPSTR lpszSrc, unsigned int wLen)

   {

    LPSTR lpEnd;
    char cTemp;

    // account for the terminating NULL
    --wLen;

    for (lpEnd = lpszSrc; *lpEnd && (lpEnd - lpszSrc) < wLen;
               lpEnd = AnsiNext(lpEnd))
        ;  // scan to the end of string, or wLen bytes

    // The following can happen only if lpszSrc[wLen-1] is a lead
    // byte, in which case do not include the previous DBC in the copy.
    if (lpEnd - lpszSrc > wLen)
        lpEnd -= 2;

    // Terminate the source string and call lstrcpy.
    cTemp = *lpEnd;
    *lpEnd = '\0';
    lstrcpy(lpszDst, lpszSrc);
    *lpEnd = cTemp;

   }
				

속성

기술 자료: 75439 - 마지막 검토: 2014년 1월 29일 수요일 - 수정: 1.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Windows Software Development Kit 3.1
키워드:?
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com