Sep 232008
 

Unicode 문자 개수 구하기.

UTF-16 문자 개수 구하기.

int GetUtf16GlyphCount(const wstring& utf16)
{
    static const wchar_t    HIGH_SURROGATE_MIN = L'\xD800';
    static const wchar_t    HIGH_SURROGATE_MAX = L'\xDBFF';
    static const wchar_t    LOW_SURROGATE_MIN = L'\xDC00';
    static const wchar_t    LOW_SURROGATE_MAX = L'\xDFFF';

    bool    bHighSurrogate = false;
    int     count = 0;
    for(wstring::const_iterator iter = utf16.begin(); iter != utf16.end(); ++iter)
    {
        const wchar_t& ch = *iter;

        if( HIGH_SURROGATE_MIN <= ch && ch <= HIGH_SURROGATE_MAX )
        {
            assert( !bHighSurrogate );
            bHighSurrogate = true;
        }
        else if( LOW_SURROGATE_MIN <= ch && ch <= LOW_SURROGATE_MAX )
        {
            assert( bHighSurrogate );
            bHighSurrogate = false;

            ++count;
            assert( count < numeric_limits<int>::max() );
        }
        else
        {
            assert( !bHighSurrogate );
            ++count;
        }
    }

    return count;
}

Continue reading »

by-nc-sa

Sep 212008
 

UTF-8 문자의 크기는 그림과 같이 1-byte에서 4-byte까지 가질 수 있다. 가장 큰 특징인 기존 US-ASCII와 호환성을 위해 이런 가변 길이 인코딩을 선택했는데, 덕분에 영어는 1-byte로 표현할 수 있지만 한글은 3-byte가 필요하다. 양키들이 쓰는 US-ASCII와 호환성도 있고 기존과 같이 1-byte로 표현할 수 있어서 양키들이 선호하는 인코딩으로 생각된다. Unicode 인코딩 중 UTF-8만 지원하는 라이브러리들이 많다.

Continue reading »

by-nc-sa

Sep 172008
 

Windows에서 Unicode 인코딩은 UTF-16을 기본으로 사용하고 Unicode라고 부르기보다는 wide character라고 부른다. 그래서 Windows에서 wide character는 UTF-16 character라고 생각하면 된다. wide character 자료형인 wchar_t는 Windows에서는 2-byte이다. 여기서 자료형이 2 byte란 얘기지 UTF-16 문자가 다 2 byte란 얘기가 아님에 주의.

코드 상에서 문자,문자열 앞에 L을 붙이면 wide character로 저장된다.

#include <iostream>

using namespace std;
int main(int argc, wchar_t* argv[])
{
    wchar_t temp = L'가';
    // 모든 UTF-16 캐릭터가 2-byte라고 가정하고 코드를 짜는건 위험하다.
    // BMP를 벗어나는 code point는 4-byte로 인코딩된다. 이건 테스트니깐 뭐~

    wcout.setf( ios::showbase );
    wcout.setf( ios::hex, ios::basefield );
    wcout << static_cast<unsigned short>(temp) << endl;

    return 0;
}

Continue reading »

by-nc-sa

Aug 122008
 

모든 문자에 고윳값을 할당하는 테이블을 만드는 프로젝트가 유니코드 컨소시엄과 ISO 10646에 의해 시작됐다. 문제는 하나의 단체가 아니라 두 단체라는 거. 이거 다 편하자고 하는 일인데, 다른 두 개의 테이블이 만드는 것은 모든 사람이 원하지 않는 일이라는 것을 알고 같은 문자 셋을 만드는 걸 합의했다. 그냥 하나의 단체로 통합됐으면 하나 내가 모르는 사정에 의해 그것은 불가능한가 보다. 각자의 기준을 발표하는데, 항상 호환 가능하게 하고 있으니 이것만 해도 다행이다.

유니코드 컨소시엄의 유니코드와 ISO 10646의 UCS(Universal Character Set)은 문자에 고윳값을 할당하는 테이블일 뿐, 그 이상의 의미는 가지지 않는다. 여기서 문자에 할당되는 중복되지 않는 고유의 정수 값을 Code point라고 한다. UCS와 유니코드의 모든 문자들은 같은 위치를 가지며 같은 명칭을 사용한다. 참고로 Unicode 5.1에서 한글의 Code point는 다음과 같다. Hangul Syllables Range : AC00-D7AF, Hangul Jamo Range : 1100-11FF, Hangul Compatibility Jamo Range : 3130-318F, Halfwidth And Fullwidth Forms Range : FF00-FFEF

Continue reading »

by-nc-sa