[date:20130701]の検索結果


C言語のstrlen関数では文字列の長さとして返ってくる値はバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。

Webアプリケーションのテキスト処理ではそれでは不都合な場合もことも多いので、半角英数も全角文字(漢字、ひらがな、カタカナなど) も1文字としてカウントする関数を作成することにします。

#include <stdio.h>
#include <string.h>

int strlen_utf8(char *cp);
int _bytesize(unsigned char code);

int main(void)
{
    char *testAscii = "ABCDEFG";
    char *testHira  = "あいうえお";
    char *testKata  = "アイウエ";
    char *testKanji = "愛々木";
    char *testAll = "ABCDEFGあいうえおアイウエオ愛夢佐々木";

    printf("strlen(testAscii) = %d\n", strlen(testAscii));
    printf("strlen_utf8(testAscii) = %d\n", strlen_utf8(testAscii));

    printf("strlen(testHira) = %d\n", strlen(testHira));
    printf("strlen_utf8(testHira) = %d\n", strlen_utf8(testHira));

    printf("strlen(testKata) = %d\n", strlen(testKata));
    printf("strlen_utf8(testKata) = %d\n", strlen_utf8(testKata));

    printf("strlen(testKanji) = %d\n", strlen(testKanji));
    printf("strlen_utf8(testKanji) = %d\n", strlen_utf8(testKanji));

    printf("strlen(testAll) = %d\n", strlen(testAll));
    printf("strlen_utf8(testAll) = %d\n", strlen_utf8(testAll));

    return 0;
}

/* UTF-8でエンコードされた文字列の文字数を取得 */
int strlen_utf8(char *cp)
{
    int textlen = strlen(cp);
    int pos = 0;
    int count = 0;

    while (pos < textlen) {
        unsigned char code;
        code = *(cp + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return count;
}

/* 文字のバイト長を求める */
int _bytesize(unsigned char code)
{
    int size = 1;
    int i;

    if (0x80 & code) { /* 1バイト文字以外 */
        for (i = 2; i <= 8; i++) {
            code <<= 1;
            if (!(0x80 & code)) {
                break;
            }
            size++;
        }
    }
    return size;
}

strlen_utf8関数では、1バイト目のASCIIコード値をパラメータとして_bytesize関数を呼び出して文字のバイト数を求め、1文字分の処理を行うたびに文字数をカウントアップしています。

また、_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定して戻り値として返しています。

プロクラムの実行結果は以下のようになります。

kagahiro@kagahiro-PC ~/sample/c
$ ./strlen_utf8
strlen(testAscii) = 7
strlen_utf8(testAscii) = 7
strlen(testHira) = 15
strlen_utf8(testHira) = 5
strlen(testKata) = 12
strlen_utf8(testKata) = 4
strlen(testKanji) = 9
strlen_utf8(testKanji) = 3
strlen(testAll) = 52
strlen_utf8(testAll) = 22

[2323] Posted by kagahiro at 2013/07/01 20:46:54
1 point | Link (3) | Trackback (0) | Comment (1)

Unicodeエスケープシーケンスは、\uXXXX(Xは十六進)の6バイトの形でUnicodeの1文字が表される文字の表記方法で、例えば、「あ」という文字はUnicodeエスケープシーケンスで「\u3042」と表記される。

Unicode エスケープシーケンス 変換
Unicodeエスケープシーケンス変換ツール
C++でunicode escape sequenceをutf8にする
[2322] Posted by kagahiro at 2013/07/01 17:23:39
0 point | Link (1) | Trackback (0) | Comment (0)

Wikibooks(ウィキブックス、 Wiki-textbook を略した名称)は、インターネット上で共同して自由に利用できるオープンコンテントの参考書・教科書を作成してするプロジェクト。プロジェクトで作成される本の著作権はGNU Free Documentation Licenseとなっている。

Wikibooks 日本語版
[2321] Posted by kagahiro at 2013/07/01 13:21:18
0 point | Link (1) | Trackback (0) | Comment (0)

  1  


アクセスランキング

今日のアクセスランキング TOP 10

  1. フリーソフトウェア/オープンソースのタブー (8 PV)
  2. [食べ物]七草粥(ななくさがゆ) (4 PV)
  3. グーグルニュース(Google News)日本語版が見れるURL (4 PV)
  4. [将棋]竜王戦第三局は居飛車振り飛車の対抗型で丸山忠久九段が勝利 #竜王戦 (4 PV)
  5. MetaTrader 4(MT4) (2 PV)
  6. ウェブページを1回だけリロード(再表示)する方法 (2 PV)
  7. Google(グーグル) 日本版 (2 PV)
  8. Google News (グーグルニュース)日本版 (2 PV)
  9. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (2 PV)
  10. NHKスペシャル「激流中国」が面白い (1 PV)

今月のアクセスランキング TOP 10

  1. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (2850 PV)
  2. グーグルニュース(Google News)日本語版が見れるURL (736 PV)
  3. フリーソフトウェア/オープンソースのタブー (505 PV)
  4. [食べ物]七草粥(ななくさがゆ) (485 PV)
  5. [将棋]竜王戦第三局は居飛車振り飛車の対抗型で丸山忠久九段が勝利 #竜王戦 (479 PV)
  6. Google News (グーグルニュース)日本版 (448 PV)
  7. [将棋]将棋実況ユーチューバーのクロノさんが朝日新聞のクレームで棋譜中継を配信中止 (225 PV)
  8. グーグルニュース(Google News)のRSS/atomが取得できない (171 PV)
  9. USTREAM(ユーストリーム) 日本語版 無料のライブ映像配信サービス (158 PV)
  10. [Perl]UTF-8でエンコードされた文字列の文字数を取得するコード (142 PV)

アクセス統計

ディレクトリ

関連サイト