[date:20130702]の検索結果


C言語のstrncpy関数やmemcpy関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。 そこで半角英数も全角文字も1文字として部分文字列を取り出すことができる関数を作成します。

以下はそのコードです。[C言語]UTF-8でエンコードされた文字列の文字数を取得するコードと同様に、文字の1バイト目のビットの状態を調べることによってその文字が何バイト文字を判定しています。

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

char *substr_utf8(char *dest, char *src, int offset, int len);
int _bytesize(unsigned char code);


int main(void)
{
    char *testStr = "ABCDEFGあいうえおアイウエオ愛夢佐々木";
    char strBuf[256];

    memset(strBuf, 0sizeof strBuf);

    printf("substr_utf8($testStr, 0, 5) = %s\n", substr_utf8(strBuf, testStr, 05));
    printf("substr_utf8($testStr, 3, 3) = %s\n", substr_utf8(strBuf, testStr, 33));
    printf("substr_utf8($testStr, 10, 4) = %s\n", substr_utf8(strBuf, testStr, 104));
    printf("substr_utf8($testStr, 13, 5) = %s\n", substr_utf8(strBuf, testStr, 135));

    return 0;
}

/* UTF-8でエンコードされた文字列の部分文字列を取り出す */
/* substr_utf8 (文字列式, オフセット, 長さ)*/
char *substr_utf8(char *dest, char *src, int offset, int len)
{
    int srclen = strlen(src);
    int pos = 0;
    int count = 0;
    char *cp = dest;

    while (pos < srclen) {
        unsigned char code;
        code = *(src + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);

        if (count >= offset && count < (offset + len)) {
            memcpy(cp, (src + pos), bytelen);
            cp += bytelen;
            *cp = '\0';
        }
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return dest;
}

/* 文字のバイト長を求める */
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;
}

実行結果
$ ./substr_utf8
substr_utf8($testStr, 0, 5) = ABCDE
substr_utf8($testStr, 3, 3) = DEF
substr_utf8($testStr, 10, 4) = えおアイ
substr_utf8($testStr, 13, 5) = イウエオ愛

[2324] Posted by kagahiro at 2013/07/02 11:02:48
0 point | Link (3) | Trackback (0) | Comment (0)

  1  


アクセスランキング

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

  1. Tumblr(タンブラー)のダッシュボードからおすすめ投稿を消す(非表示にする)方法 (33 PV)
  2. 最新のGoogle News(グーグルニュース)日本版のRSSが取得できるURL (31 PV)
  3. [将棋]角換わり▲4五桂速攻(△6五桂速攻) #佐藤天彦名人 #三浦弘行九段 (18 PV)
  4. 有力将棋系ユーチューバーのショウヤンさんが将棋ウォーズで「ソフト指し」を告白し衝撃走る (12 PV)
  5. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (11 PV)
  6. USTREAM(ユーストリーム) 日本語版 無料のライブ映像配信サービス (10 PV)
  7. グーグルニュース(Google News)日本版が表示できるURL (7 PV)
  8. Google News (グーグルニュース)日本版 (6 PV)
  9. PHPでMySQLに接続して、SELECTでデータを取得するサンプルプログラム (4 PV)
  10. [将棋]将棋実況ユーチューバーのクロノさんが朝日新聞のクレームで棋譜中継を配信中止 (4 PV)

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

  1. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (2751 PV)
  2. 有力将棋系ユーチューバーのショウヤンさんが将棋ウォーズで「ソフト指し」を告白し衝撃走る (757 PV)
  3. Tumblr(タンブラー)のダッシュボードからおすすめ投稿を消す(非表示にする)方法 (532 PV)
  4. 最新のGoogle News(グーグルニュース)日本版のRSSが取得できるURL (470 PV)
  5. Google News (グーグルニュース)日本版 (431 PV)
  6. グーグルニュース(Google News)日本版が表示できるURL (316 PV)
  7. [将棋]角換わり▲4五桂速攻(△6五桂速攻) #佐藤天彦名人 #三浦弘行九段 (316 PV)
  8. USTREAM(ユーストリーム) 日本語版 無料のライブ映像配信サービス (217 PV)
  9. [Perl]UTF-8でエンコードされた文字列の文字数を取得するコード (193 PV)
  10. ウェブページを1回だけリロード(再表示)する方法 (192 PV)

アクセス統計

ディレクトリ

関連サイト