[漢字]の検索結果


云々(でんでん、うんぬん)とは、引用した文や語句のあとを省略するときに、以下略の意で、その末尾に添える語で、以前は「うんぬん」と読まれていたが、安倍首相が国会答弁で「でんでん」と呼んだことで、権力者の発言に弱い日本では今後は「でんでん」と読まれることが多くなると思われる。

[2618] Posted by kagahiro at 2017/01/26 15:36:23
0 point | Link (1) | Trackback (0) | Comment (0)

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)

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)

Perlのsubstr関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。それでは不都合なことも多いので、半角英数も全角文字も1文字と...
[2244] Posted by kagahiro at 2012/12/13 10:51:25
0 point | Link (4) | Trackback (0) | Comment (0)

Perlのlength関数ではバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。ブログなどのアプリケーションのテキスト処理ではそれでは不都合な場合も...
[2243] Posted by kagahiro at 2012/12/12 11:56:21
1 point | Link (3) | Trackback (0) | Comment (1)

W-ZERO [es]、ケータイの手軽さとパソコンの便利さが融合されたウィルコムのシャープ製モバイル端末W-ZERO [es] は、2006年7月27日に販売が開始された、OSとして「Windows Mobile 5.0 日本語版」を採用し、デュアル・...
(追記あり)
[788] Posted by kagahiro at 2006/07/27 22:09:56
0 point | Link (8) | Trackback (0) | Comment (0)

Yahoo!のウェブ検索で、「日本語スペルチェック」と「表記のゆれ」の2つの日本語検索機能を強化されました。「日本語スペルチェック」は、タイプミスやカタカナ/平仮名/漢字の誤変換に対応し、仮名漢字変換時の誤変換...
[667] Posted by kagahiro at 2006/06/24 17:12:54
2 point | Link (2) | Trackback (2) | Comment (0)

  1  


アクセスランキング

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

  1. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (15 PV)
  2. 2chまとめサイト - 痛いニュース(ノ∀`) (2 PV)
  3. SQLiteのSELECT文で上位 (TOP) n件のデータを取得する (2 PV)
  4. Google Finance(グーグルファイナンス)- リアルタイム株価情報、金融ニュース、日本株 (1 PV)
  5. MySQLのUPDATE文でLIMIT句を使用して上位3件のレコードを更新する (1 PV)
  6. FC2まとめ (1 PV)
  7. 完全無料のMT5用ナンピンEA「Nanpin K(ナンピンケイ) MT5」 使用制限無し (1 PV)
  8. 中上級者向け安全性重視のナンピンツール(半自動EA)「Million Dollar Pro」 #MT4 #有料版 (1 PV)
  9. [FX]同一通貨ペアのポジションをまとめて決済できるMT5向けツール(EA)「Closer(クローザー) MT5」を完全無料で公開 (1 PV)
  10. 将棋実況チャンネル【クロノ】 - ヤフーニュースに掲載された将棋系ユーチューバー (1 PV)

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

  1. 2NN 2ちゃんねるニュース速報+ナビ (3274 PV)
  2. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (503 PV)
  3. 安全性重視の完全無料ナンピンマーチンEA「Million Dollar(ミリオンダラー)」 #FX #ゴールド #ビットコイン (92 PV)
  4. 自作のMT4向け無料EA(口座縛り無し、ブローカー縛り無し、使用期限無し)とゴゴジャン出品中の有料EAの一覧 #MT4 (89 PV)
  5. SQLiteのSELECT文で上位 (TOP) n件のデータを取得する (72 PV)
  6. Million Dollar Ver 1.09向けの収益性を重視したゴールド(Gold、XAUUSD)ロングセットファイル (64 PV)
  7. 無料のMT4向けナンピンマーチン爆益(爆損)EA「Jipangu(ジパング)」 (63 PV)
  8. 仲値トレードが簡単にできる無料EA「NAKANE3 Ver 2.04」 #MT4 (59 PV)
  9. [FX]裁量ポジションを簡単に管理できるMT4向け無料の裁量補助EA「PositionKeeper」 (51 PV)
  10. 2chまとめサイト - 痛いニュース(ノ∀`) (48 PV)

アクセス統計

ディレクトリ

関連サイト