「半角カナを全角カナに変換」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
(ページの作成:「windows7において半角カナから全角カナへの変換方法についていろいろ調べてみて、自分にとって使いやすいプログラムを見つけ...」)
 
imported>Webmaster
1行目: 1行目:
 
windows7において半角カナから全角カナへの変換方法についていろいろ調べてみて、自分にとって使いやすいプログラムを見つけたので備忘的に残しておきます<br />
 
windows7において半角カナから全角カナへの変換方法についていろいろ調べてみて、自分にとって使いやすいプログラムを見つけたので備忘的に残しておきます<br />
 
【修正ポイント】<br />
 
【修正ポイント】<br />
*\1 better written as $1のエラーのため一部修正
+
*Windoes端末からの操作のためbinmode STDOUTをcp932へ変更
*Windows標準入出力に変更
 
  
参考:[http://blog.livedoor.jp/dankogai/archives/51693618.html 404 Blog Not Found]
+
参考:[http://blog.livedoor.jp/dankogai/archives/51693618.html 404 Blog Not Found]<br />
 
参考:[http://blog.livedoor.jp/dankogai/archives/51031595.html 404 Blog Not Found]
 
参考:[http://blog.livedoor.jp/dankogai/archives/51031595.html 404 Blog Not Found]
 
入力例:東京都千代田区九段南2丁目 付近 (1)
 
出力例:東京都千代田区九段南二丁目 付近 (一)
 
  
 
<syntaxhighlight lang="perl">
 
<syntaxhighlight lang="perl">
#!/usr/bin/perl
+
use strict;
#ソースファイルは UTF8形式で保存
+
use warnings;
use strict;
+
use utf8;
use warnings;
 
 
#内部処理はUTF-8で行うための宣言
 
use utf8;
 
use Encode;
 
 
# windows標準はencoding(cp932)
 
binmode STDOUT, ':encoding(cp932)'; #標準出力
 
binmode STDERR, ':encoding(cp932)'; #標準エラー出力
 
binmode STDIN, ':encoding(cp932)';  #標準入出力
 
  
while (<>) {
+
#これで標準出力が自動的にcp932にencodeされる
 +
binmode STDOUT , ":encoding(cp932)";
  
   # 数字は半角にそろえておく
+
{
    y/1234567890/1234567890/;
+
   use Encode;
   # 単独の0は「ゼロ」に書き換える
+
   use Encode::JP::H2Z;
    s/(?<!\d)0(?!\d)/ゼロ/g;  
+
   my $eucjp = Encode::find_encoding('eucjp');
   # 桁区切りのコンマを取っておく
+
   sub hankaku2zenkaku {
    s/(?<=\d),(?=(\d\d\d)+(?!\d))//g;
+
     my $str = $eucjp->encode(shift);
   # 4桁ごとに区切って万億兆を挿入
+
     Encode::JP::H2Z::h2z(\$str);
     s/(?<=\d)(?=\d\d\d\d(?!\d))/万/g;
+
     $eucjp->decode($str);
     s/(?<=\d)(?=\d\d\d\d(?=万))/億/g;
+
   }
     s/(?<=\d)(?=\d\d\d\d(?=億))/兆/g;
+
  sub zenkaku2hankaku {
   # 下から1桁ずつ十百千を挿入
+
      my $str = $eucjp->encode(shift);
    s/(?<=\d)(?=\d(?!\d))/十/g;
+
      Encode::JP::H2Z::z2h(\$str);
    s/(?<=\d)(?=\d(?!\d))/百/g;
+
      $eucjp->decode($str);
    s/(?<=\d)(?=\d(?!\d))/千/g;
+
   }
   # 0になってる桁を削除
+
}
    s/0[十百千]//g;
+
 
    s/億0万/億/g;
+
print hankaku2zenkaku("オンドゥルルラギッタンディスカー!?"), "\n";
    s/兆0億/兆/g;
+
print zenkaku2hankaku("ウソダドンドコドーン"), "\n";
    s/0//g;
 
  # 十百には1をつけない
 
    s/1([十百])/$1/g;
 
  # 各桁を漢数字に書き換え
 
    y/123456789/一二三四五六七八九/;
 
  
    print $_;
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
----
 +
== 文字コードを意識的にプログラムする ==
 +
入り口で decode して、内部ではすべて flagged utf8 で扱い、出口で encode する。これがすべてです!とにかくこの基本方針をまもっていれば幸せになれます。
 +
  
 
<!-- カテゴリに追加するページ名を記入 -->
 
<!-- カテゴリに追加するページ名を記入 -->
 
[[Category:Perl|はんかくかなをぜんかくかなにへんかん]]
 
[[Category:Perl|はんかくかなをぜんかくかなにへんかん]]

2016年1月1日 (金) 14:40時点における版

windows7において半角カナから全角カナへの変換方法についていろいろ調べてみて、自分にとって使いやすいプログラムを見つけたので備忘的に残しておきます
【修正ポイント】

  • Windoes端末からの操作のためbinmode STDOUTをcp932へ変更

参考:404 Blog Not Found
参考:404 Blog Not Found

use strict;
use warnings;
use utf8;

#これで標準出力が自動的にcp932にencodeされる
binmode STDOUT , ":encoding(cp932)";

{
  use Encode;
  use Encode::JP::H2Z;
  my $eucjp = Encode::find_encoding('eucjp');
  sub hankaku2zenkaku { 
    my $str = $eucjp->encode(shift);
    Encode::JP::H2Z::h2z(\$str);
    $eucjp->decode($str);
  }
  sub zenkaku2hankaku { 
      my $str = $eucjp->encode(shift);
      Encode::JP::H2Z::z2h(\$str);
      $eucjp->decode($str);
  }
}

print hankaku2zenkaku("オンドゥルルラギッタンディスカー!?"), "\n";
print zenkaku2hankaku("ウソダドンドコドーン"), "\n";

文字コードを意識的にプログラムする

入り口で decode して、内部ではすべて flagged utf8 で扱い、出口で encode する。これがすべてです!とにかくこの基本方針をまもっていれば幸せになれます。