UTF-8 + 文字数カウント

C++ で UTF-8 の文字数を数えるコードを試しに書いてみたメモ。

バイト数ではなく、文字数。

  
#include   
#include   
  
int strlen_utf8( const char *buff )  
{  
    if( buff == NULL ) return 0;  
      
    int count = 0;  
    int pos = 0;  
    int max_bytes = strlen( buff );  
      
    // BOM 読み飛ばし  
    if( max_bytes >= 3 )  
    {  
        if( static_cast( buff[0] ) == 0xEF &&  
            static_cast( buff[1] ) == 0xBB &&  
            static_cast( buff[2] ) == 0xBF )  
        {  
            pos += 3;  
        }  
    }  
      
    while( pos < max_bytes )  
    {  
        ++count; // 文字数カウント  
          
        if( ( buff[pos] & 0x80 ) == 0 )  
        {  
            ++pos; // 1バイト文字  
        }  
        else  
        {  
            for( char tmp = buff[pos] & 0xfc; (tmp & 0x80); tmp = tmp << 1 )  
            {  
                ++pos; // 複数バイト文字  
            }  
        }  
    }  
    return count;  
}  
  
int main()  
{  
    char *str = "あ過サタな";  
    int cnt = strlen_utf8( str );  
      
    printf( "String: %s\n", str );  
    printf( "Count: %d\n", cnt );  
  
    return 0;  
}  

結果

  
String: あ過サタな  
Count: 5  

おしまい

UTF-8 は1バイト目に後に続くバイト数が示されている為、簡単に実装できた。

意外とここら辺の勉強もしてみると面白いなー。

参考: UTF-8 Wikipedia