C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1002] UTF-8 문자열에서 유니코드 뽑아내기 및 3바이트 문자 판단.
김태선 [cppbuilder] 15631 읽음    2010-07-23 17:20
UTF-8을 다룰 일이 있어서 프로그램 만들면서
제작한 간단한 함수 2개 뽑아서 소개합니다.


// UTF-8 유니코드에서 3바이트 문자인 경우, 식별비트를 제거하고 2바이트 한문자로 만들어 돌린다.
// 3바이트 문자가 아니라면 0을 돌린다.
//
WORD    GetUTF8ToUnicode(byte *p)
{
    WORD code = 0;
    if ((p[0] & 0xF0) == 0xE0 && (p[1] & 0xC0) == 0x80 && (p[2] & 0xC0) == 0x80)
    {
        code = ((WORD)(p[0] & 0xF) << 12) | ((WORD)(p[1] & 0x3F) << 6);
        code |= (p[2] & 0x3F);
    }
    return code;
}

// 이건 유니코드 글자중에 한글 한자 등 3바이트 글자인가 확인하는 작업.

bool    IsUTF8_3ByteWord(byte *p)
{
    if ((p[0] & 0xF0) == 0xE0 && (p[1] & 0xC0) == 0x80 && (p[2] & 0xC0) == 0x80)
        return true;
    return false;
}

빌더는 막강한 문자 코드 변환 함수가 준비되어 있어서
보통은 이런거 몰라도 문제가 없지만, UTF-8 코드를 직접 파싱 한다던지
직접 판단해야 할때 그 구조를 모르면 만들기 곤란하죠.
이건 잘 동작하는거 확인한 것이니 복사 신공용.
김도완 [purplecofe2]   2010-07-23 18:06 X
(p[1] & 0xC0) == 0x80 && (p[2] & 0xC0) == 0x80
이 부분은 확장 한글에서 문제가 있습니다. 뒤에 1바이트는 가끔 0x80이 맞지 않는 경우가 있습니다.
김태선 [cppbuilder]   2010-07-24 07:34 X
확장 한글이라면 어떤 것을 말씀하시는 지요?
유니코드 AC00~D7AF, 1100~11FF, 3130~318F 외의 영역에 기록되는 한글이 있다는 뜻인지요.
위 루틴은 800~FFFF 영역의 3바이트 글자에 대한 판단에 쓰이는 것이고,
아직 오동작을 하는 경우는 못 봤습니다. 유니코드는 4바이트 문자도 있으니,
그건 따로 판단을 만들어야 겠지만 그건 이 문제와 별개죠.
김도완 [purplecofe2]   2010-07-25 16:57 X
아 유니코드 변환이었네요.  wbtomb로 상위 비트 체크하는걸루 착각했습니다 (__);
김태선 [cppbuilder]   2010-07-26 11:13 X
^^; 저도 코드 착각 할때가 있어요.
cp949 확장 한글과 유니코드간의 변환에 있어서는 확장 한글에 없는 글자 때문에
문제가 되는 경우가 있더군요.

+ -

관련 글 리스트
1002 UTF-8 문자열에서 유니코드 뽑아내기 및 3바이트 문자 판단. 김태선 15631 2010/07/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.