師匠の散歩

きままにPerlでも

Jcode test

文字コード変換を行う/ subjcode.cgi

設定

open (FILEIN, "./data/shiftjis.txt") or die;
  @readsjis = <FILEIN>;
close (FILEIN);

jcode.pl

開発者のページの最新バージョンを右クリックして、「jcode.pl」のファイル名で保存すればよい。

# jcode.plを使用する場合
require "./jcode.pl";
@line = @readsjis;
foreach $line(@line){
  &jcode::convert(*line, "euc");         # lineの前はアスタリスク*となるので注意すること
}

Jcode.pm

開発者のページに詳しく書いてある。リンクすると、なぜか英文ページが表示される。その場合、http://openlab.ring.gr.jp/を訪問し、リンクを辿ると日本語が表示される。同じ index-j.htmlなのだが、なにかあるのだろう。深くは突っ込まないことにする。

日本語で説明。ダウンロードしてもいいが、Windowsマシンだと最新のActivePerlには実装されており、UNIXのほうはサーバー管理者でなければ、実用できない。 Jcode-2.07.zip

# 元ファイルがShift_JISの場合、EUCで記述するページで表示させると文字化けする。
# そのため、EUC-JPに変換で文字化けを解消する
# Jcode.pm が搭載されたマシンで動作する
use Jcode;                                   # モジュール
@line = @readsjis;
foreach my $line (@line) {
  # Jcode::convert( $line , "euc", "sjis" ); # 対象文字列,変換後の文字コード,返還前の文字コード
    $line = jcode($line)->h2z->euc;          # 元の漢字コードがわからなくても、類推して変換してくれる。
                                             # この場合、jcode と小文字で始まる
                                             # jcode($line)->euc; ではエラーになるので注意 
}
# 元の漢字コード指定を間違うと、とんでもない文字化けになり、類推して変換するのが無難
# utf8 と記述するが、UTF-8(ボムあり)ではなく、UTF-8N(ボムなし)になる。
# 変換指定に入る文字列
original(sjis)をeucで表示utf8 -> eucjcode($read)->h2z->euc/td>
n}^f[^ ID=fmdid:7-26 ????n?}????^?f?[?^ ID=fmdid:7-26 基盤地図情報メタデータ ID=fmdid:7-26
n}_E[hf[^iGMLj ????n?}?????_?E?????[?h?f?[?^?iGML?Łj 基盤地図情報ダウンロードデータ(GML版)
yn@ ???y?n???@ 国土地理院
Op_ ?O?p?_ 三角点
lOp_ ?l???O?p?_ 四等三角点
TR46040470901 TR46040470901 TR46040470901
??? 赤滝
145237.4274 145237.4274 145237.4274
507562.5866 507562.5866 507562.5866
517.51 517.51 517.51
2 2 2
yn@ ???y?n???@ 国土地理院
Op_ ?O?p?_ 三角点
lOp_ ?l???O?p?_ 四等三角点
TR46040541901 TR46040541901 TR46040541901
m ???m?? 湯ノ沢
145561.4537 145561.4537 145561.4537
506214.7389 506214.7389 506214.7389
378.39 378.39 378.39
2 2 2

Encode.pm

use Encode;
use Encode::Guess qw/ shiftjis euc-jp utf8 7bit-jis /;

# / shiftjis euc-jp utf8 7bit-jis /; ニックネーム
@line = @sjisdata;
foreach my $line(@line) {
# $line2 = encode('utf8', decode('Guess', $line));      # Guess による推定はエラーになった
  $line2 = encode('euc-jp', decode('shiftjis', $line)); # 元の文字コードを入れると正しく変換された
  print $line,$line2;
 }
Encodeモジュールの場合
original(sjis)をeucで表示shiftjis -> euc
n}^f[^ ID=fmdid:7-26 基盤地図情報メタデータ ID=fmdid:7-26
n}_E[hf[^iGMLj 基盤地図情報ダウンロードデータ(GML版)
yn@ 国土地理院
Op_ 三角点
lOp_ 四等三角点
TR46040470901 TR46040470901
赤滝
145237.4274 145237.4274
507562.5866 507562.5866
517.51 517.51
2 2
yn@ 国土地理院
Op_ 三角点
lOp_ 四等三角点
TR46040541901 TR46040541901
m 湯ノ沢
145561.4537 145561.4537
506214.7389 506214.7389
378.39 378.39
2 2

まとめ

jcode.plはUTF8に対応していないので、新しい漢字コード変換が必要にななった(strict対応という意味でもモジュールが欲しくなった)。モジュールとしてはEncodeのほうが新しいようだが、JcodeとEncodeでは、今のところ、(師匠の確認した範囲では)類推変換ができたJcodeの勝ち!

他の検討

記述言語による違い1
EUC-JP
Shift_JIS
UTF-8N

subjcode.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18