JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2014年05月 / 04月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>06月

アクセスランキング

[ジャンルランキング]
コンピュータ
413位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
58位
アクセスランキングを見る>>

Picture of the day: クリアファイル

今日は、栄のシモジマに行っていくつか文具・事務用品を買ってきました。
これを写真で伝える必要があるのかどうかよくわかりませんが、手元にカメラがあったので一枚。

P5181260.jpg

買うたびに不思議に思うんですが、クリアファイルって10枚, 20枚単位で買うのに、捨てるときは1枚単位なんですよね。しかも、記憶では買うペース>捨てるペースなような。

薄いから増えてもあまり気にならないというのもあるかもしれませんが、きちんと整理しないとファイルの意味がなくなってしまうような気もします。

#また一か月経ってしまうところだったのでくだらない記事を書いてみました
#せっかくのクリアファイルの記事なので、活用法などあればぜひ教えてください
   Photo    TB(0)    CM(0)    EDIT    ページ↑

オブジェクトのリファレンスにまとめてUTF8フラグを付加する

久々に技術系の記事です。

先日、JSONモジュールで出力するオブジェクトに、utf-8 fraggedな文字列と、そうでない文字列が混ざっているという事態が発生しました。
その理由というのが、利用しているサーバのDBIモジュールのバージョンが古く、データを読みだす際にUTF8フラグを付加してくれていなかったというもの。サーバ側の事情ともなれば、こちらとしてはどうしようもないので、出力時に一括変換することにしました。といっても、コードは簡単な再帰関数です。
#簡単な再帰関数なのですが、書くのが面倒でググり続けた結果数時間を無駄にしてしまいました…

ということで、参考までに。

use utf8;
use Encode;

sub decode_utf8c{
    my $txt = shift;
    unless (utf8::is_utf8($txt)){
        $txt = Encode::decode_utf8($txt);
    }
    return $txt;
}

sub add_utf8_flag{
    my $data = shift;
    if (ref($data) eq "HASH"){
        my %hash = %$data;
        foreach my $key (keys(%hash)){
            if (ref($hash{$key}) eq ""){
                $data->{$key} = decode_utf8c($data->{$key});
            } else {
                add_utf8_flag($data->{$key});
            }
        }
    } elsif (ref($data) eq "ARRAY"){
        my @array = @$data;
        my $i;
        for($i=0; $i<=$#array; $i++){
            if (ref($array[$i]) eq ""){
                $data->[$i] = decode_utf8c($data->[$i]);
            } else {
                add_utf8_flag($data->[$i]);
            }
        }
    }
    return $data;
}


デリファレンスしたオブジェクトへの変更は、もとのリファレンスには反映されない、というのが要注意です。
   Perl    TB(0)    CM(0)    EDIT    ページ↑

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。