UTF-8 문자열에서 문자 하나가 가지는 바이트 수를 구해보자. 요점은 글자 첫 바이트를 찾아 시작점부터 그곳까지 차이를 구하는 것이다.
별 다를 것은 없고, 주어진 다음 글자에 0xc0(11000000)를 곱해 0x80(10000000)인지 판단한다.
#include <iostream> #include <string> using namespace std; constexpr auto g_src("한글123ABCabc漢字!@#$^&*()한글123ABCabc漢字"); size_t getUtf8Size(const uint8_t* ib, const uint8_t* ie) { auto s(ib); while ( ++ib not_eq ie ) { if ( ((*ib) bitand 0xc0) not_eq 0x80 ) break; } return size_t(ib-s); } size_t getUtf8Size(const uint8_t* ib) { auto s(ib); while ( *(++ib) ) { if ( ((*ib) bitand 0xc0) not_eq 0x80 ) break; } return size_t(ib-s); } int main(int argc, char* argv[]) { const uint8_t* ib(reinterpret_cast<const uint8_t*>(g_src)); const uint8_t* ie(ib + strlen(g_src)); size_t size; cout << "Type #1" << endl; while ( ib not_eq ie ) { size = getUtf8Size(ib, ie); cout << string(reinterpret_cast<const char*>(ib), size) << ": " << size << endl; ib+=size; } cout << "Type #2" << endl; ib = reinterpret_cast<const uint8_t*>(g_src); while ( *ib ) { size = getUtf8Size(ib); cout << string(reinterpret_cast<const char*>(ib), size) << ": " << size << endl; ib+=size; } }
별 다를 것은 없고, 주어진 다음 글자에 0xc0(11000000)를 곱해 0x80(10000000)인지 판단한다.
댓글
댓글 쓰기