文字化けした文字を調査
文字化けの原因を調査した。(ほぼ一日かかった。。。)
特定の文字っぽかったので、文字のバイトコードを確認した。
UTF-8で「能」という文字の一文字前。
if( $string = q/(.)\x{80FD}/ ) { print unpack("H*", $1); }
調べたら、「c28a」が取りだせた。
その情報から下記の文字という事が分かった。
http://www.fileformat.info/info/unicode/char/8a/index.htm
でも、普通に入力できる。
実体参照にすると(Š)空白になって文字化けする。
以下環境
・Perl v5.8.8
・PostgreSQL 8.1.23
・文字コードはUTF-8
今回の文字をCSVでダウンロードしようとすると(CP938)「?」になってしまう。
UTF-8で文字をデコードして、CP932に変換した時に「?」になってしまうので、
その前に取り除くか、他の文字に置換してあげると良さそう。
ただ一つ、なんでそんな文字を入力したのかが気になる。すごく気になる。
参考にしたページ
http://it-scrap.blogspot.jp/2009/12/perl.html
http://www.fileformat.info/info/unicode/char/search.htm
http://www.seiai.ed.jp/sys/text/java/utf8table.html
http://ash.jp/code/unitbl21.htm
TwitterのRSSを取得する
http://www.lifehacker.jp/2013/08/130804twitter_rss.html
少し回りくどいけれど、この通りにやれば取得できる。
TwitterのRSSが普通に取得できなくなったのはとても不便だけれど、
こうやって誰でも取得できる方法を公開してくれる事で、不便が少なくなっていく事は素晴らしい。
複数のselect要素を連動させる
http://www.skuare.net/test/jdependent.html
これを使ったら行けそうだったけど、
表示が undefind になって困った。
jQuery1.3.2 以降あたりからtextの取得が出来ないみたいなので下記のサイトを参考に修正した。
階層の問題
以下の様な文字列を
foo:表示 aa:表示 bb:表示 cc:表示 dd:表示 ee:表示 ff:表示 bar:表示 ff:表示 gg:表示
↓のように変換したい問題
[ { 'value' => 'foo', 'data' => [ { 'value' => 'aa', 'is_show' => 't' }, { 'value' => 'bb', 'is_show' => 't' }, { 'value' => 'cc', 'data' => [ { 'value' => 'dd', 'is_show' => 't' }, { 'value' => 'ee', 'is_show' => 't' }, ], 'is_show' => 't' }, ], 'is_show' => 't', }, { 'value' => 'bar', 'data' => [ { 'value' => 'ff', 'is_show' => 't' }, { 'value' => 'gg', 'is_show' => 't' }, ], 'is_show' => 't', }, ]
以下のようにしてみました。
#!/usr/bin/perl -w use strict; my $text = qq|foo:非表示 aa:表示 bb:非表示 cc:表示 dd:表示 ee:非表示 ff:表示 bar:表示 ff:表示 gg:非表示 hoge:表示 moge:表示|; my $text2 = qq|aaa:表示 bbb:非表示 ccc:表示 ddd:表示 eee:表示|; my @texts = split(/(?:\r\n|\r|\n)/, $text2); # ここに入れていく my $array = ; # 階層 my $level_count = 0; for(my $i=0; $i < scalar @texts; $i++) { # 階層が下がった if($level_count < ($texts[$i] =~ tr/ //)) { # 進んだ回数、親、配列、階層を渡す my $parent = $texts[$i-1]; $level_count++; # 階層が一つ下がった my $child_array; my $is_last; ($i, $child_array, $level_count, $is_last) = &_array($i, $parent, \@texts, $level_count); # $level_count--; # 戻ってきたら一つ階層が上がる my $hash = {}; # 親子のペア my( $value, $is_show ) = ($parent =~ m/[\s+]?([^\s].+):(非表示|表示)/); $hash->{value} = $value; $hash->{is_show} = ($is_show =~ m/^表示$/ ? 't' : 'f'); $hash->{data} = $child_array; # 1階層目のデータ push(@$array, $hash); # 進めた分進める $i = $i - 1; # 最後だったら終わり if( $is_last ) { last; } } else { # 次のデータが一つ下がるなら無視(親子の関係を作るため) next if($texts[$i+1] && ($texts[$i] =~ tr/ //) < ($texts[$i+1] =~ tr/ //)); # 1階層目のデータ my( $value, $is_show ) = ($texts[$i] =~ m/[\s+]?([^\s].+):(非表示|表示)/); push(@$array, {'value' => $value, 'is_show' => ($is_show =~ m/^表示$/ ? 't' : 'f')}); } } use Data::Dumper; die Dumper $array; sub _array { my $num = shift; my $parent = shift; my $texts = shift; my $level_count = shift; # ここに入れていく my $array = ; # 進めた回数 for(my $i=$num; $i < scalar @$texts; $i++) { ## 階層の比較 # 階層が一つ下がった if($level_count < ($texts->[$i] =~ tr/ //)) { my $parent = $texts->[$i-1]; $level_count++; # 階層が一つ下がる my $child_array; my $is_last; ($num, $child_array, $level_count, $is_last) = &_array($i, $parent, $texts, $level_count); # $level_count--; # 戻ってきたら一つ階層が上がる my $hash = {}; # 親子のペア my( $value, $is_show ) = ($parent =~ m/[\s+]?([^\s].+):(非表示|表示)/); $hash->{value} = $value; $hash->{is_show} = ($is_show =~ m/^表示$/ ? 't' : 'f'); $hash->{data} = $child_array; # 同じ階層のデータ push(@$array, $hash); # 進めた分進める $i = $num - 1; # 最後だったら返す if( $is_last ) { return ($#$texts, $array, $level_count, 1); } # 階層が一つ上がった } elsif($level_count > ($texts->[$i] =~ tr/ //)) { $level_count--; # 階層が一つ上がる return ($i, $array, $level_count); # 同じ階層だった } elsif($level_count == ($texts->[$i] =~ tr/ //)) { # 次のデータが一つ下がるのなら無視(親子の関係を作るため) next if($texts->[$i+1] && ($texts->[$i] =~ tr/ //) < ($texts->[$i+1] =~ tr/ //)); # 次のデータも同じ階層か階層が一つ上がる場合は同じ階層のデータとして入れる my( $value, $is_show ) = ($texts->[$i] =~ m/[\s+]?([^\s].+):(非表示|表示)/); push(@$array, {'value' => $value, 'is_show' => ($is_show =~ m/^表示$/ ? 't' : 'f')}); } } ## 最後まで行ってしまったら、そのまま帰す return ($#$texts, $array, $level_count, 1); }
どなたか添削してください。
この後、逆変換もやります。