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

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

#include <stdio.h>
#include <string.h>
 
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<unsigned char>( buff[0] ) == 0xEF &&
			static_cast<unsigned char>( buff[1] ) == 0xBB &&
			static_cast<unsigned char>( 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

 

さぁ、才能に目覚めようという本の付録で資質を診断してみた。

1. 学習欲
2. 自我
3. 目標志向
4. 収集心
5. 内省

学習欲は、学習することが好きだよねーみたいな。
自我は、認められたいみたいな。
目標志向は、つねに目標を欲して定めるみたいな。
収集心は、モノが捨てられないみたいな。
内省は、自分との心の会話が好きみたいな。

これが自分の資質だったのか。

こちらを伸ばすカタチでひとまず頑張ろうといった感じか。

こういう資質とか、なかなか興味深くて好きな分野だ。

 

polipo のファイル制限についてメモ。

CentOS iso(3.7GB)をダウンロードしようとしたら、2GB に制限された。

そのままダウンロードを続けてみたら、完了時に polipo が落ちてしまった。

polipo の設定を解除したら、ちゃんとダウンロードされるようになったので、

原因は、polipo で間違いなさそう。

なんなのだろう。

assertコードが吐かれていたけど、CHUNK_SIZE がどうたらといった内容。(コピペし忘れた)

とりあえず polipo の設定ファイルとか見てみたけど、よく分からない。

何が 2GB 制限に影響してるんだろう。

うーん?

 

Windows のターミナルソフト TeraTerm

vi とかで Delete キーが効かない問題。

結果として、キーマップ設定ファイルがおかしかったっぽい。

デフォルトで読み込まれるファイルが KEYBOARD.CNF。

そのファイルは、 IBMKEYB.CNF を元に作成されていて、

IBMKEYB.CNF のキーマップがずれていることが原因らしい。

前のバージョンを引き継いでるかららしいけど、過去のキーマップだから古いのかなー。

簡単な対策として。

1.とりあえずインストール先ディレクトリに移動(C\:Program Files\teraterm)

2.まず KEYBOARD.CNF をバックアップ用に __KEYBOARD.CNF にリネームして保存。

3.続いて FUNCTION.CNF をコピーして KEYBOARD.CNF という名前で保存。

4.TeraTerm起動後、設定 → キーマップ読み込み → KEYBOARD.CNF を読み込む。

5.設定 → キーボード の Delete にチェックが入っていたらはずす。

たぶん、これでおk。

1月 012009
 

あけましておめでとうございます。