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

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
(ページの作成:「windows7において半角カナから全角カナへの変換方法についていろいろ調べてみて、自分にとって使いやすいプログラムを見つけ...」)
 
imported>Webmaster
 
(同じ利用者による、間の8版が非表示)
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">
出力例:東京都千代田区九段南二丁目 付近 ()
+
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";
 +
 
 +
</syntaxhighlight>
 +
----
 +
== 文字コードを意識的にプログラムする ==
 +
  入り口で decode して、内部ではすべて flagged utf8 で扱い、出口で encode する。これがすべてです!とにかくこの基本方針をまもっていれば幸せになれます。
 +
という言いつけを守るために、<code>binmode</code>を使わないで意識的に文字コードを考えたら私的には以下のようにするのが良いと感じました。<br />
 +
このようにすることで、出力する直前に必要な文字コードに変換して出力するという意識になります。<br />
 +
 
 +
 
 +
<syntaxhighlight lang="perl">
 +
use strict;
 +
use warnings;
 +
use utf8;
 +
 
 +
{
 +
  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 encode('cp932',hankaku2zenkaku("オンドゥルルラギッタンディスカー!?")), "\n";
 +
print encode('cp932',zenkaku2hankaku("ウソダドンドコドーン")), "\n";
 +
 
 +
</syntaxhighlight>
  
 +
== 文字も記号も数字も全て半角を全角にする ==
 +
いろいろ使って見て分かったことですけど、半角を全角にする場合にはモジュールという便利な物を使う必要がある<br />
 +
モジュールには標準モジュールの<code>Encode.pm</code>と別途インストールして使用する<code>Unicode::Japanese</code>および<code>Lingua::JA::Regular::Unicode</code>がある。<br />
 +
ここでやりたいこととと異なってきた内容で、標準モジュールの<code>Encode.pm</code>要するに今まで説明した<br />
 +
<syntaxhighlight lang="perl">
 +
      Encode::JP::H2Z::z2h(\$str);
 +
</syntaxhighlight>
 +
といった、<code>Encode::JP::H2Z::z2h</code>では全角変換は<span style="color:red">'''カナのみで、数字や記号については変換しない'''</span>事が分かりました。<br />
 +
これを回避するために新たに<code>use Unicode::Japanese;</code>を使うと数字や記号も変換します<code>Unicode::Japanese;</code>を使う場合には<code>Unicode::Japanese</code>をインストールしなければなりません。<br />
 +
=== Unicode::Japaneseインストール方法 ===
 +
<syntaxhighlight lang="perl">
 +
$ perl -MCPAN -e shell
 +
cpan> install Unicode::Japanese
 +
</syntaxhighlight>
 +
インストール環境に問題が無ければこれでモジュールがインストールされます。<br />
 +
=== サンプルプログラム ===
 +
これも'''UTF-8'''で保存する必要がありますので注意が必要です
 
<syntaxhighlight lang="perl">
 
<syntaxhighlight lang="perl">
#!/usr/bin/perl
+
#UTF-8で保存する
#ソースファイルは UTF8形式で保存
+
use strict;
use strict;
+
use warnings;
use warnings;
+
use utf8;
+
use Encode;#これがないと「Undefined subroutine &main::encode called at」が出る
#内部処理はUTF-8で行うための宣言
+
use Unicode::Japanese;
use utf8;
+
 
use Encode;
+
#$str_hに半角データを入れる
+
my $str_h = '012ABCabc!@#アイウガダパ';
# windows標準はencoding(cp932)
+
 
binmode STDOUT, ':encoding(cp932)'; #標準出力
+
#cp932で表示してみる(1)
binmode STDERR, ':encoding(cp932)'; #標準エラー出力
+
print encode('cp932',$str_h),"\n";
binmode STDIN, ':encoding(cp932)'; #標準入出力
 
  
while (<>) {
+
#Unicode::Japaneseで表示してみる(2)cp932でもsjisでも表示される
 +
print Unicode::Japanese->new($str_h)->cp932,"\n";
  
  # 数字は半角にそろえておく
+
#(1)(2)は同じ結果になる、表示ルールを変えただけ
    y/1234567890/1234567890/;
+
 
  # 単独の0は「ゼロ」に書き換える
+
#h2z(半角から全角)
    s/(?<!\d)0(?!\d)/ゼロ/g;
+
#通常の表示方法
  # 桁区切りのコンマを取っておく
+
#->cp932を->getとするとutf8で保存される
    s/(?<=\d),(?=(\d\d\d)+(?!\d))//g;
+
print Unicode::Japanese->new($str_h)->h2z->cp932,"\n";
  # 4桁ごとに区切って万億兆を挿入
 
    s/(?<=\d)(?=\d\d\d\d(?!\d))/万/g;
 
    s/(?<=\d)(?=\d\d\d\d(?=万))/億/g;
 
    s/(?<=\d)(?=\d\d\d\d(?=億))/兆/g;
 
  # 下から1桁ずつ十百千を挿入
 
    s/(?<=\d)(?=\d(?!\d))/十/g;
 
    s/(?<=\d)(?=\d(?!\d))/百/g;
 
    s/(?<=\d)(?=\d(?!\d))/千/g;
 
  # 0になってる桁を削除
 
    s/0[十百千]//g;
 
    s/億0万/億/g;
 
    s/兆0億/兆/g;
 
    s/0//g;
 
  # 十百には1をつけない
 
    s/1([十百])/$1/g;
 
  # 各桁を漢数字に書き換え
 
    y/123456789/一二三四五六七八九/;
 
  
    print $_;
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
これを実行した場合以下の結果になります<br />
 +
<code>012ABCabc!@#アイウガダパ</code><br />
 +
<code>012ABCabc!@#アイウガダパ</code><br />
 +
これで、半角を全角にすることが出来ます
  
 
<!-- カテゴリに追加するページ名を記入 -->
 
<!-- カテゴリに追加するページ名を記入 -->
 
[[Category:Perl|はんかくかなをぜんかくかなにへんかん]]
 
[[Category:Perl|はんかくかなをぜんかくかなにへんかん]]

2016年8月13日 (土) 11:21時点における最新版

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 する。これがすべてです!とにかくこの基本方針をまもっていれば幸せになれます。

という言いつけを守るために、binmodeを使わないで意識的に文字コードを考えたら私的には以下のようにするのが良いと感じました。
このようにすることで、出力する直前に必要な文字コードに変換して出力するという意識になります。


use strict;
use warnings;
use utf8;

{
  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 encode('cp932',hankaku2zenkaku("オンドゥルルラギッタンディスカー!?")), "\n";
print encode('cp932',zenkaku2hankaku("ウソダドンドコドーン")), "\n";

文字も記号も数字も全て半角を全角にする

いろいろ使って見て分かったことですけど、半角を全角にする場合にはモジュールという便利な物を使う必要がある
モジュールには標準モジュールのEncode.pmと別途インストールして使用するUnicode::JapaneseおよびLingua::JA::Regular::Unicodeがある。
ここでやりたいこととと異なってきた内容で、標準モジュールのEncode.pm要するに今まで説明した

      Encode::JP::H2Z::z2h(\$str);

といった、Encode::JP::H2Z::z2hでは全角変換はカナのみで、数字や記号については変換しない事が分かりました。
これを回避するために新たにuse Unicode::Japanese;を使うと数字や記号も変換しますUnicode::Japanese;を使う場合にはUnicode::Japaneseをインストールしなければなりません。

Unicode::Japaneseインストール方法

$ perl -MCPAN -e shell
cpan> install Unicode::Japanese

インストール環境に問題が無ければこれでモジュールがインストールされます。

サンプルプログラム

これもUTF-8で保存する必要がありますので注意が必要です

#UTF-8で保存する
use strict;
use warnings;
use utf8;
use Encode;#これがないと「Undefined subroutine &main::encode called at」が出る
use Unicode::Japanese;

#$str_hに半角データを入れる
my $str_h = '012ABCabc!@#アイウガダパ';

#cp932で表示してみる(1)
print encode('cp932',$str_h),"\n";

#Unicode::Japaneseで表示してみる(2)cp932でもsjisでも表示される
print Unicode::Japanese->new($str_h)->cp932,"\n";

#(1)と(2)は同じ結果になる、表示ルールを変えただけ

#h2z(半角から全角)
#通常の表示方法
#->cp932を->getとするとutf8で保存される
print Unicode::Japanese->new($str_h)->h2z->cp932,"\n";

これを実行した場合以下の結果になります
012ABCabc!@#アイウガダパ
012ABCabc!@#アイウガダパ
これで、半角を全角にすることが出来ます