プロが教えるわが家の防犯対策術!

Jcode.pmを使用して半角カナから全角カナに変換したいのです。
こちらの過去ログを拝見し、以下のようなロジックを記述したのですが、
”Undefined subroutine &Jcode::h2z_euc called at test_jcode.pl line 7.”というエラーが出てしまいます。


use Jcode;
$line = 'アイウエオ';
$ato = &Jcode::h2z_euc(\$line);
print $ato, "\n";

どなたかご回答よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

$line に入っている文字コードの判別に失敗しているのかもしれません。


Jcode->new($line,'euc')->h2z->sjis;
のように指定すると上手くいきませんか?

sjis にする必要が無い場合は
Jcode->new($line,'euc')->h2z;
でいいはずです。
    • good
    • 0
この回答へのお礼

(1)"アイウエオ"
(2)"ア\nイ\nウ\nエオ"
(3)"アイウエオ"

(2)や(3)だと半角から全角へ変換されるのですが,
(1)だとうまくいきません。

先輩に聞いたところ,Oracleで同じような事をしてくれる関数があるようなので、そちらを試してみることにします。
多数の回答ありがとうございました。

お礼日時:2002/01/30 15:28

> 全角から半角への変換はうまくいったのですが、


これは、Jcode->new($line)->z2h->euc; としたと言うことですか?
z2h を使わないと全角から半角へは変換しないはずですが。

> 半角から全角への変換がうまくいきません。
$line に半角カナが入っているんですよね?
Jcode->new($line)->h2z->euc;
私が試した限りではこれで上手く行くんですけど。

> 原因として、半角カナがeucである事だと考えられるのです。
> そこで、euc から sjis へ変更しようとしたのですが,うまくいきません。
sjis に変換するには、
Jcode->new($line)->sjis; です。
半角->全角変換も同時にする場合は
Jcode->new($line)->h2z->sjis; です。

この回答への補足

>これは、Jcode->new($line)->z2h->euc; としたと言うことですか?

そうです。すみません。説明不足で…

Jcode->new($line)->sjis;

上記を試してみましたが,sjisへ変換できないのです。

変換さえできればうまくいくと思うのですが…

補足日時:2002/01/28 09:20
    • good
    • 1

use Jcode;


$line = "アイウエオ";
$s = Jcode->new($line)->h2z->euc;
print $s,"\n";

で上手くいきませんか?

この回答への補足

全角から半角への変換はうまくいったのですが、
半角から全角への変換がうまくいきません。

原因として、半角カナがeucである事だと考えられるのです。
そこで、euc から sjis へ変更しようとしたのですが,うまくいきません。

何が問題なのでしょうか。

補足日時:2002/01/25 20:47
    • good
    • 1

そういえば、私も &Jcode::h2z がうまく使えなかった記憶があります。


で、結局以下のようにしました。

use Jcode::H2Z;
$line = 'アイウエオ';
&Jcode::H2Z::h2z(\$line);
print $line, "\n";

Jcode モジュールをインストールしたのなら、Jcode::H2Z はインストール
されているはずなので、これでできるのではないかと。
Jcode.pm を読むと、Jcode::h2z って Jcode::H2Z::h2z を呼び出していた
だけだったので。

この回答への補足

試してみましたが,出来ませんでした。

$lineに全角カナをいれると全角カナのまま
半角カナをいれると半角カナのまま出力されてしまいます。

Jcode::convertを使用して現在の文字コードを出力させたところ、うまく出ましたので,Jcodeモジュール自体は正しくインストールされているはずなのですが。。。

補足日時:2002/01/25 12:01
    • good
    • 0

Jcode.pm には h2z_euc は無いみたいですが、



use Jcode;
$s = Jcode->new($s)->h2z->euc;

で出来ませんか。

この回答への補足

試してみたのですが,変換したい文字列をどこに記述すればよいのかわかりません。
教えてください。

補足日時:2002/01/25 09:30
    • good
    • 0

$ato = &Jcode::h2z_euc(\$line);


の部分を
$ato = &Jcode::h2z(\$line);
に変更してもダメでしょうか.

この回答への補足

$ato = &Jcode::h2z(\$line);
$ato = &{$Jcode::h2z{'euc'}}(\$line)

上記のように、インターネットなどで記載されている使用方法は全てやってみたのですが,うまくいかないのです。
やはりjcode.plでないとだめなのでしょうか。

補足日時:2002/01/22 15:34
    • good
    • 0

Jcode.pmは使ったことがありませんでした。


Perlのバージョン等は大丈夫なのですよね?

参考URL:http://openlab.ring.gr.jp/Jcode/index-j.html

この回答への補足

バージョンは、5.6.630(最新)です。

Jcode.pmに移行するには以下の2点を変更するだけで、ほぼいけるという記述をインターネットで見つけたのですが,できません。

(1)require jcode.pl → use Jcode;
(2)jcode:: → Jcode::

Jcode.pmでは出来ないということであれば、jcode.plを使用使用とは思っているのですが。。。

補足日時:2002/01/17 15:03
    • good
    • 0

jcode.plというライブラリを使用するのですよね?


ならば

require "jcode.pl";
$line = "アイウエオ";
&jcode'h2z_euc(*$line);
print "$line\n";

でイケると思うのですが。。

この回答への補足

jcode.plではなく、jcode.plの後継モジュールJcode.pmでは出来ないのですか。

出来ないのであればjcode.plでやります。。。

補足日時:2002/01/17 13:57
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q全角英数字を半角英数字に変換したい

全角英数字を半角英数字に変換する方法を教えて下さい。

$data =~ tr/0-9a-zA-Z/0-9a-zA-Z/;

以上のようにした場合、J-perl意外では望みどおりに変換されません。

jcode.plをつかって
全角英数字を半角英数字に変換する方法があると、
書かれていた方がいましたので、
できればjcode.plをつかった場合の
具体的なスクリプトの書き方を教えて下さい。

よろしくお願いいたします。

Aベストアンサー

jcode.pl を使って $data の全角文字英数字を半角英数字にするには、次のようにするとできるかもしれません。

&jcode::tr(\$data, '0-9A-Za-z-', '0-9A-Za-z-');

参考 URL で詳しく書かれていますので、ご覧ください。

参考URL:http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-10

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む

Q全角ひらがな、漢字をマッチさせたい

Perlでフォームに入力された値をチェックするとき、入力される文字列は半角文字以外を入力されるとエラーになるスクリプトを書きたいと思っています。
(ただし、半角に出来る文字「カタカナ、記号等」は半角に変換するのでエラーでは無いとしたいです)

どうすれば実現出来るでしょうか。
よろしくお願いします。

Aベストアンサー

パターンマッチを利用することをオススメします。
とりあえず、余計なマッチミスを防ぐためにも、EUCコードに変換してから処理を行います。
参考URLのページに詳しく解説されています。
参考URLのページをみても分からなければ、補足をお願いします。

一応、主要な文字コードのパターンを記しておきます。
$nobashi = '(?:\xA1[\xBC\xBD\xC1])'; # ー-~
$kigo = '(?:[\xA1\xA2][\xA1-\xFE])'; # 全角の記号
$suuji = '(?:\xA3[\xB0-\xB9])'; # 0-9
$alphabet = '(?:\xA3[\xC1-\xDA\xE1-\xFA])'; # 全角英字
$alpha_big = '(?:\xA3[\xC1-\xDA])'; # 全角英字(大文字A-Z)
$alpha_small = '(?:\xA3[\xE1-\xFA])'; # 全角英字(小文字a-z)
$hiragana = '(?:\xA4[\xA1-\xF3])'; # ぁ~ん
$katakana = '(?:\xA5[\xA1-\xF6])'; # ァ~ヶ

参考URL:http://www.din.or.jp/~ohzaki/perl.htm

パターンマッチを利用することをオススメします。
とりあえず、余計なマッチミスを防ぐためにも、EUCコードに変換してから処理を行います。
参考URLのページに詳しく解説されています。
参考URLのページをみても分からなければ、補足をお願いします。

一応、主要な文字コードのパターンを記しておきます。
$nobashi = '(?:\xA1[\xBC\xBD\xC1])'; # ー-~
$kigo = '(?:[\xA1\xA2][\xA1-\xFE])'; # 全角の記号
$suuji = '(?:\xA3[\xB0-\xB9])'; # 0-9
$alphabet ...続きを読む

QJcode.pmでの半角カナ→全角カナ変換

Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。

use Jcode;
$euc_string = jcode($form_input)->h2z->euc;

原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。

use Jcode;
$euc_string = jcode($form_input,"sjis")->h2z->euc;

ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。

半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか?
Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。

use Jcode;
$euc_string = jcode($form_input)->h2z->euc;

原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。

use Jcode;
$euc_string = jcode($form_input,"sjis")->h2z->eu...続きを読む

Aベストアンサー

私は、bkoさんのあげられているような、入力文字列を"SJIS"と決めうちする方法を取っています。ほとんどのブラウザでは、SJISでフォームを出力した場合にはSJISで日本語をエスケープして送信してくるからです。実際、SJISのフォームに対してeucで送信してくるブラウザは、最近のブラウザでは見たことがありません。
(昔は平気でeucで返してきましたけど:-))

sjisの半角カナはeucとかぶる領域に存在しますので、これを識別するには日本語として正しいのか、までを意識する必要があり、めんどうな実装となると思います。

Q機種依存文字の文字コード変換

現在、Shift-JISでCGIを作成しています。言語はPerlです。HTMLファイルから送信された文字をDBに登録するのですが、CGIをShift-JISで作成しているのに、DBがEUCとなっているため、jcode.plを利用して文字コードを変換しています。
しかし、文字が機種依存文字である場合、jcode.plでは文字コード変換ができないようで文字化けを起こした文字をDBに登録しようとしてエラーを起こしてしまいます。
何とか機種依存文字をコード変換したいのですが、可能でしょうか?

Aベストアンサー

Unicode::Japanese はご存知ですか?
”はしごだか”などの環境依存文字が混在する場合Jcodeでは変換できませんので、Unicode::Japaneseを使うと便利です。

http://search.cpan.org/~hio/Unicode-Japanese-0.40/

PurePerlとしても動作するので、サーバへのインストールも不要です。上記アドレスからDL・解凍後、lib内の Japanese.pm をコピーしてきて利用元のソースと同じパスに置く、あるいは任意のパスに置いてuse libするだけで利用可能です。


use Unicode::Japanese;

my $x = "変換元文字列";
my $s = Unicode::Japanese->new($x, "sjis");

open(FILE, ">./euc.txt");
print FILE $s->euc;
close(FILE);

こんな感じ。使い方はJcodeとほぼ同じです。

参考URL:http://search.cpan.org/~hio/Unicode-Japanese-0.40/

Unicode::Japanese はご存知ですか?
”はしごだか”などの環境依存文字が混在する場合Jcodeでは変換できませんので、Unicode::Japaneseを使うと便利です。

http://search.cpan.org/~hio/Unicode-Japanese-0.40/

PurePerlとしても動作するので、サーバへのインストールも不要です。上記アドレスからDL・解凍後、lib内の Japanese.pm をコピーしてきて利用元のソースと同じパスに置く、あるいは任意のパスに置いてuse libするだけで利用可能です。


use Unicode::Japanese;

my $x = "変換元文字列";
m...続きを読む

Qutf-8での日本語正規表現の書き方

WindowsXPでPerlの正規表現の勉強をしています。
下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。

use utf8;
use encoding ("utf-8");

# 例1##################################
$str1 = "そろそろ夏も終わりですね。";
$str2 = "夏";
if ($str1 =~ /夏/)
{
print "例1の答え: 含まれています \n";
}
else
{
print "例1の答え: 含まれていません \n"
}

# 例2 ###################################
$count = 0;
open(FH, "C:\\temp\\hoge.txt");
while(<FH>)
{
if (/夏/)
{
$count++;
}
}

print "$count \n";

WindowsXPでPerlの正規表現の勉強をしています。
下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。

use utf8;
use encoding ("utf-8");

# 例1##################################
$str1 = "そろそろ夏も終わりですね。";
$str2 = "夏";
if ($str1 =~ /夏/)
{
print "例1の答え: 含ま...続きを読む

Aベストアンサー

実はPerlのUTF8文字列には二種類あります。
とか断言しちゃうといいすぎなんですが、例1でのUTF8文字列には
「UTF8フラグ」というものがついています。その一方で例2の
ファイルから読み込んできたものにはこの「UTF8フラグ」はついていません。
このため、スクリプト中の'夏'と外部ファイルにあった'夏'とが
同じものとはみなされなかったために質問にあるような結果になります。

#1の回答でhimajin10000さんがやっているようにファイルのオープンを
すると、こんどはUTF8フラグがついた状態でファイルからの読み込みが
行われます。そうすることで二つの'夏'が同じであると認識されるように
なったわけです。

use utf8や use encoding 'utf8' というのはただ単にスクリプトが
utf8で書かれていることを明示するプラグマではありませんので
注意が必要です。

Perl 5.8.x Unicode関連
http://www.rwds.net/kuroita/program/Perl_unicode.html

実はPerlのUTF8文字列には二種類あります。
とか断言しちゃうといいすぎなんですが、例1でのUTF8文字列には
「UTF8フラグ」というものがついています。その一方で例2の
ファイルから読み込んできたものにはこの「UTF8フラグ」はついていません。
このため、スクリプト中の'夏'と外部ファイルにあった'夏'とが
同じものとはみなされなかったために質問にあるような結果になります。

#1の回答でhimajin10000さんがやっているようにファイルのオープンを
すると、こんどはUTF8フラグがついた状態でファイル...続きを読む

Qひらがなから全角カタカナへの変換の仕方

Perlでひらがなから全角カタカナへの変換の仕方について教えてください。

ここのサイトで「全角カタカナからひらがなへの変換」の仕方が書いてありました。コレを元に逆に指定すれば出来るかな?って思ったのですが。。。どうやればいいのか全くわかりません。たぶんですが文字コードなどで指定しているとは思うのですが。。。どなたかわかる方がいましたら教えて下さい。よろしくお願いします。

#全角カタカナからひらがなへの変換の仕方
$a =~ s/(\x83)([\x40-\x7e])/"\x82".sprintf("%c",ord($2)+0x5f)/eg;
$a =~ s/(\x83)([\x80-\x96])/"\x82".sprintf("%c",ord($2)+0x5e)/eg;

上記の逆に「ひらがなから全角カタカナへの変換」出来るようにしたいです。よろしく御願いします。

Aベストアンサー

Unicode::Japanese モジュールを使用する場合は、サーバ上で、その変換を行うプログラムがあるディレクトリに Unicode という名前のディレクトリを作成し、その中に Japanese.pm をアップロードすれば OK です。
Japanese.pm は、下記のページの上の方にある "Source" と書かれたリンクから入手できます。
http://search.cpan.org/dist/Unicode-Japanese/lib/Unicode/Japanese.pm

ちなみに、ソースコードを UTF-8 でお書きになられているならば、特別なモジュールを使わなくても簡単に変換できます。

----------
use utf8;
binmode STDOUT, ':utf8'; # 標準出力に UTF-8 を使う
$a = "あいうえお";
$a =~ tr/あ-ん/ア-ン/; # ひらがなから全角カタカナへ変換
print $a; # 「アイウエオ」と表示
----------

お察しの通り、
$a =~ tr/ア-ン/あ-ん/;
とすれば逆の変換もできます。

Unicode::Japanese モジュールを使用する場合は、サーバ上で、その変換を行うプログラムがあるディレクトリに Unicode という名前のディレクトリを作成し、その中に Japanese.pm をアップロードすれば OK です。
Japanese.pm は、下記のページの上の方にある "Source" と書かれたリンクから入手できます。
http://search.cpan.org/dist/Unicode-Japanese/lib/Unicode/Japanese.pm

ちなみに、ソースコードを UTF-8 でお書きになられているならば、特別なモジュールを使わなくても簡単に変換できます。

----...続きを読む

QPerlからメール送信で文字化け

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サブジェクト 髙﨑";
$subject = &mimeencode($mail_subject);
print OUT "Subject: $mail_subject\n";

print OUT "Mime-version: 1.0\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n";
print OUT "Content-Transfer-Encoding: 7bit\n\n";

$honbun = "メール本文 髙﨑";
&jcode'convert(*honbun, 'jis');
print OUT "$honbun\n";

close(OUT);

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サ...続きを読む

Aベストアンサー

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対応になるかと思います。

---ここから---
#!/usr/bin/perl
use strict;
use utf8;

use Encode;

my $sendmail = '/usr/lib/sendmail';

print "Content-type: text/html\n\n test\n";

my $out;
if (!(open($out,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print $out "To: xxxx\@hogehoge.co.jp\n";
print $out "From: xxxx\@hogehoge.co.jp\n";
print $out "Reply-To: xxxx\@hogehoge.co.jp\n";

my $mail_subject = "サブジェクト 髙﨑";
$mail_subject = encode('MIME-Header', $mail_subject);
print $out "Subject: $mail_subject\n";

print $out "Mime-version: 1.0\n";
print $out "Content-Type: text/plain\; charset=\"UTF-8\"\n";
print $out "Content-Transfer-Encoding: 8bit\n\n";

my $honbun = "メール本文 髙﨑";
$honbun = encode("UTF-8", $honbun);
print $out "$honbun\n";

close($out);
---ここまで---

といった形でしょうか。

ただし、最近はまず大丈夫だと思いますが、
「日本語のメール」としては、ISO-2022-JPで送るのが主流であり、UTF-8で送った場合にはメールソフトによっては問題が出るかもしれないことは覚悟する必要があるかと思います。

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対...続きを読む


人気Q&Aランキング