[date:20121219]の検索結果


まずカタカナより比較的プログラミングしやすそうな英数字の全角半角変換から作成します。

半角から全角への変換の処理手順は、

・半角英数字の場合は、同じ全角英数字に置き換えて戻り値として返す文字列に連結
・それ以外の文字の場合はそのまま戻り値として返す文字列に連結

また、全角から半角への変換の処理手順は、

・全角英数字の場合は、同じ半角英数字に置き換えて戻り値として返す文字列に連結
・それ以外の文字の場合はそのまま戻り値として返す文字列に連結

となります。

文字コードはそれぞれ以下の通りですので、これらに該当する文字があったら置き換えを行います。

半角数字:0 - 9
30 - 39

全角数字:0 - 9
EFBC90 - EFBC99
2バイト目まではEFBC

半角アルファベット大文字:A - Z
41 - 5A

全角アルファベット大文字:A - Z
EFBCA1 - EFBCBA
2バイト目まではEFBC

半角アルファベット小文字:a - z
61 - 7A

全角アルファベット小文字:a - z
EFBD80 - EFBD9A
2バイト目まではEFBD

以下が英数字の半角から全角へ、全角から半角への変換を行うコード(プログラム)です。

#!/usr/bin/perl

use strict;
use warnings;
use Encode;

my $hanAlnum = "ABCDEい12345あabcde";
my $zenAlnum = "ABCDEい12345あabcdeカ";

my $zenstr = han2zen_alnum($hanAlnum);
Encode::from_to($hanAlnum, 'utf8', 'cp932');
Encode::from_to($zenstr, 'utf8', 'cp932');
print "$hanAlnum ---> $zenstr\n";

my $hanstr = zen2han_alnum($zenAlnum);
Encode::from_to($zenAlnum, 'utf8', 'cp932');
Encode::from_to($hanstr, 'utf8', 'cp932');
print "$zenAlnum ---> $hanstr\n";

# UTF-8でエンコードされた半角英数字を全角英数字に変換する
sub han2zen_alnum {
    my ($src) = @_;

    my $srclen = length($src);
    my $pos = 0;
    my $dest = '';
    while ($pos < $srclen) {
        my $code = ord substr($src, $pos, 1); # 先頭のASCIIコード値を取得
        my $bytelen = _bytesize($code);

        my $lastbyte = 0;
        my $bytechar = '';
        my $flagged_utf8 = ''; 
        if ($code >= 0x30 && $code <= 0x39) { # 数字
            $lastbyte = 0x90 + ($code - 0x30);
            $bytechar = pack("C3", 0xEF, 0xBC, $lastbyte);
            $dest .= $bytechar;
        }
        elsif ($code >= 0x41 && $code <= 0x5A) { # 大文字英字
            $lastbyte = 0xA1 + ($code - 0x41);
            $bytechar = pack("C3", 0xEF, 0xBC, $lastbyte);
            $dest .= $bytechar;
        
        }
        elsif ($code >= 0x61 && $code <= 0x7A) { # 小文字英字
            $lastbyte = 0x81 + ($code - 0x61);
            $bytechar = pack("C3", 0xEF, 0xBD, $lastbyte);
            $dest .= $bytechar;
        }
        else {
            $dest .= substr($src, $pos, $bytelen);
        }
        $pos += $bytelen;
    }

    return $dest;
}

# UTF-8でエンコードされた全角英数字を半角英数字に変換する
sub zen2han_alnum {
    my ($src) = @_;

    my $srclen = length($src);
    my $pos = 0;
    my $dest = '';

    while ($pos < $srclen) {
        my $code = ord substr($src, $pos, 1); # 先頭のASCIIコード値を取得
        my $bytelen = _bytesize($code);
        my $hit = 0;
        if ($code == 0xEF) { # 全角英数の場合は1バイト目がEF
            my $code2 = ord substr($src, $pos + 1, 1);  # 2バイト目
            my $code3 = ord substr($src, $pos + 2, 1);  # 3バイト目
            if ($code2 == 0xBC) {
                if ($code3 >= 0x90 && $code3 <= 0x99) {
                    $dest .= chr(0x30 + ($code3 - 0x90));
                    $hit = 1;
                }
                elsif ($code3 >= 0xA1 && $code3 <= 0xBA) {
                    $dest .= chr(0x41 + ($code3 - 0xA1));
                    $hit = 1;
                }
            }
            elsif ($code2 == 0xBD) {
                if ($code3 >= 0x80 && $code3 <= 0x9A) {
                    $dest .= chr(0x61 + ($code3 - 0x80));
                    $hit = 1;
                }
            }
        }
        if(!$hit) {
            $dest .= substr($src, $pos, $bytelen);
        }
        $pos += $bytelen;
    }

    return $dest;
}

# 文字のバイト長を求める
sub _bytesize {
    my $code = shift;
    my $size = 1;
    if (0x80 & $code) { # 1バイト文字以外
        $code <<= 1;
        for my $i (2 .. 8) {
            $size++;
            $code <<= 1;
            last if (!(0x80 & $code));
        }
    }
    return $size;
}

[2250] Posted by kagahiro at 2012/12/19 16:54:42
0 point | Link (1) | Trackback (0) | Comment (0)

  1  


アクセスランキング

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

  1. [将棋]竜王戦第三局は居飛車振り飛車の対抗型で丸山忠久九段が勝利 #竜王戦 (6 PV)
  2. [食べ物]七草粥(ななくさがゆ) (4 PV)
  3. フリーソフトウェア/オープンソースのタブー (4 PV)
  4. グーグルニュース(Google News)日本語版が表示されるURL (2 PV)
  5. [Perl]UTF-8でエンコードされた文字列の文字数を取得するコード (2 PV)
  6. [Perl]メールフォームCGIの作り方 (1 PV)
  7. Mac OS X 書籍 (1 PV)
  8. Tumblr(タンブラー)のダッシュボードからおすすめ投稿を消す(非表示にする)方法 (1 PV)
  9. [将棋]豊島将之八段が角換わり早繰り銀で藤井聡太四段に完勝するという波乱 (1 PV)
  10. [将棋]豊島将之八段が「序盤中盤終盤スキのない」将棋で「無冠の帝王」森下卓九段に完勝 #NHK杯 (1 PV)

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

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

アクセス統計

ディレクトリ

関連サイト