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
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