置換する目的は 半角カナを全角カナにする事なのですが、そこで問題が生まれました。

sjisに変換した後に、置換をすると文字化けになり、反対にする事によって正常に置換する様になっています。良くそこの仕組みが分からないのですがどうか教えて頂けないでしょうか?宜しくお願いします。

###参照プログラム###
★#半角文字を全角文字に置換するケース
&jcode::h2z_sjis(\$value);
&jcode::convert(*value, 'sjis');

★#文字化けを起こすケース
&jcode::convert(\$value, 'sjis');
&jcode::convert(\$str, 'euc');
print "str : $str<br>\n";

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

A 回答 (1件)

もし、半角かなを全角かなにしたいだけなら、



&jcode::convert(\$value, 'sjis', '' 'z');

とすると、半角かなが入っていても全角かなにしてくれます。

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

この回答への補足

回答してくれてありがとうございます。
早速試してみましたが、何かの条件があわないのか文字化けをしてしまいました。

せっかく回答して頂いたのにもかかわらず申し訳ないです。何か良い知恵がありましたら教えて下さい。
失礼ます。

補足日時:2001/11/30 11:15
    • good
    • 0

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

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

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qmy($Str)とmy $Strの違い

いつもお世話になります。
某高機能アクセス解析プロのPerlで書かれたCGIファイルの中に、
my($Str)と、my $Str が出てきます。
これは、何か特別な違いがあるのでしょうか。
知識も無いのにCGIを改造していて恐縮ですが、
このような ちょっとした事で非常に悩みます。
どうか教えて下さい。
よろしく、お願いします。

Aベストアンサー

my $str;とmy($str);はどちらもローカル変数にしているという点で同じですよ。ただNo.2の方も説明しているとおり、
同時に代入 (初期化) をする場合にその解釈 (スカラー、リスト) が違うので結果が変わり得ます。

括弧は同時に複数の変数をmy宣言する場合にも使います。
my($str1, $str2, @array, %hash);
これはmy $str1; my $str2; my @array; my %hash;と同じです。
1つの変数の場合は面倒なのでふつうは括弧を書かないでしょう。

QData::Dumper;でダンプ後表示した文字列\x{30fc}...

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rs...続きを読む

Aベストアンサー

#1さんと同じですが
use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。

QHTTP::Request::Common qw(POST);時にソフト表だとエラーになる

お世話になります。
HTTP::Request::Common qw(POST);を使ってPOSTする際、aaa=> 'あいう',などの日本語はPOST後、データが渡っている事が確認できるのですが、'ソフト表'等の文字列をあえて送ろうとすると、エラーになってしまいます。
記述はShift_JISで行っています。
先生方、ご教授ねがえませんでしょうか。
#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

#use open IN => ":utf8"; # 入力をUTF8とする
#use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'shiftjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#use open ":encoding(shiftjis)";
#require './jcode.pl';
my $ua = LWP::UserAgent->new;
#タイムアウトを設定
$ua->timeout(10);

my $req1 = POST 'http://domain.com/test.cgi',
[
aaa => 'www1',
bbb => "ソフト表" ,#bbb=> 'あいう',だとエラーになりません
];

print $ua->request($req1)->as_string;

お世話になります。
HTTP::Request::Common qw(POST);を使ってPOSTする際、aaa=> 'あいう',などの日本語はPOST後、データが渡っている事が確認できるのですが、'ソフト表'等の文字列をあえて送ろうとすると、エラーになってしまいます。
記述はShift_JISで行っています。
先生方、ご教授ねがえませんでしょうか。
#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

#use open IN =>...続きを読む

Aベストアンサー

Can't find string terminator '"' anywhere before EOF at perltest.txt line 2.

のエラーでよろしいですか? これはHTTP::Requestとは全く関係のない問題です。'表'をShift_JISで表した時の2バイト目が¥のため、クォート記号をエスケープして打ち消してしまっています。そのため、ダブルクォートが閉じられていないというエラーが出ています。

bbb => "ソフト表¥"

としてください。(¥は半角です)


このカテゴリの人気Q&Aランキング

おすすめ情報