スポンサーリンク

Perl で文字コード変換(Encode と Encode::Guess と Jcode と)

Perl を使って文字コードを変換する場合、最近は Encode::Guessモジュールで文字コードを判定して Encodeモジュールで変換するのが一般的みたいなんですが、結構この Encode::Guessモジュールが文字コード判定に失敗するみたいなんですよ(原因不明)。

ところがです、Encode::Guessモジュールが文字コード判定に失敗した文字列を Jcodeモジュールに喰わせると、あっさり変換しちゃったりします。どちらも作者は小飼弾氏なんですけど・・・謎です。

てなわけで、文字コードが不明の文字列を utf8(フラグ無し)に変換するサブルーチンを作ってみました。ソースは以下の通りです。

#!/usr/bin/perl
use strict;
use warnings;
use Jcode;
use Encode;
use Encode::Guess;

my $str = "";
# 何とかして $str に値をセット

my ($utf8, $charset) = Encode2utf8($str);
# 行いたい処理・・・
exit();

sub Encode2utf8{
  my $string = shift;
  my $newStr = "";
  my $charset= "";
  my $enc = guess_encoding($string, qw/euc-jp shiftjis 7bit-jis/);
  if(ref $enc){
    $charset = $enc->name;
    $newStr = encode('utf8', decode($charset, $string));
  }else{
    my @array = getcode($string);
    $charset = $array[0];
    $newStr = $string;
    Jcode::convert(\$newStr, 'utf8');
  }
  
  return ($newStr, $charset);
}
 

注意点としては utf8プラグマを使用しない(use utf8; しない)事でしょうか。use utf8; すると、ソース内の文字列にも utf8フラグが立って何かと便利そうなんですが、読み込んできたデータにも utf8フラグが立っちゃったりして文字コードを判定しようとすると Wide character がどうのこうのと怒られちゃうんですよね。

ただ、Jcodeモジュールのバージョン 2 以降は Encodeモジュールのラッパーになってるって話なので、Jcodeモジュールのバージョン 2 以降が入っているシステムだと意味がないのかも・・・。

ちなみに、ウチの Windows環境の Jcodeモジュールのバージョンは 0.88 なんですけど、レンタルサーバーの方は 2.05 なんですよね。気にした事無かったけど、やっぱりモジュールのバージョンも合わせた方がいいよなぁ。

参照リンク
 ・search.cpan.org:Encode
 ・search.cpan.org:Encode::Guess
 ・search.cpan.org:Jcode

スポンサーリンク
コメント
Verify your Comment
Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

コメントを投稿
トラックバック

このページのトラックバックURL:
https://www.typepad.com/services/trackback/6a01310f1f31c0970c0120a8ba9172970b

このページへのトラックバック一覧 Perl で文字コード変換(Encode と Encode::Guess と Jcode と):

おすすめの記事と広告

プロフィール


  • 書いてる人:夢界 陸

    名古屋在住のおっさん。
    プログラミングやガジェットの話など、 日々の興味を徒然と綴っています。



    Twitterやってます @mukairiku

    運営サイト
    www.mukairiku.net

ブログ内検索

Licenses

  • Creative Commons License

OTHER

  • このブログのはてなブックマーク数

Blog powered by TypePad

スポンサーリンク