• ベストアンサー

perlを使った文字列のエンコードについて

http://www.tagindex.com/tool/url.htmlにあるようなURLエンコードの処理を行いたいのですが、ソースはどのようになりますでしょうか? 下記のようなものできるのかと思いましたが、「テスト」の文字列ですと、「%83e%83X%83g」と表示されてほしいのが、「?e?X?g」となってしまいます。 お分かりの方がおられるようでしたら、ぜひ教えてください。 $str='テスト'; use Encode 'encode'; $str = encode('sjis', $str); print "$str";

  • egypt
  • お礼率87% (175/199)
  • Perl
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.1

>$str = encode('sjis', $str); 何がしたいの? encodeは「perlの内部文字列を、指定された漢字コードの文字列にするだけ」ですよ。 URIエンコード、URIデコードは、別の関数を使います。 http://slashdot.jp/journal/450313/%E3%83%A1%E3%83%A2%EF%BC%9APerl%E3%81%A7URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%83%BB%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AFURIEscape%E3%82%92%E4%BD%BF%E3%81%86 なお、pack、unpackは「時代遅れ」なので使わない方が良いです。

egypt
質問者

お礼

ありがとうございます。 やりたいことができました。

関連するQ&A

  • 文字列は大文字のまま、UTF-8エンコードの英字だけ小文字にしたい

    下記の方法でUTF-8エンコードをしたときに、 コードの英字が大文字になってしまい困っています。 use Encode; $str = "HOGEホゲ" $str =~ s/(\W)/'%' . unpack("H2", $1)/eg; print "$str"; 現状のエンコード後)HOGE%E3%83%9B%E3%82%B2 希望のエンコード後)HOGE%e3%83%9b%e3%82%b2 半角英数字(HOGE)は大文字のままで、 エンコードだけを小文字で書き出す簡単な方法はありますでしょうか。 (小文字でないと受け付けてくれないサイトに飛ばしたいため) 現状は正規表現でAからZまで26行繰り返しています。 $str =~s/\%([A-Z0-9]{1})?A/%$1a/g; ~ $str =~s/\%([A-Z0-9]{1})?Z/%$1z/g; よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 難問?Perlの文字列置換について

    下記のプログラムをベースにして置換を行いたいです。 use File::Basename; use File::Copy; use File::Find; use File::Path; my @filelist = (); $inputfile='C:\Users\test.txt'; $outputfile='C:\Users\test_new.txt'; open (IN, $inputfile) or die "$!"; open (OUT, ">$outputfile") or die "$!"; while(<IN>) { $str = $_; if ($str =~ / ・・・・・ ・・・・・ } print OUT $str; } close (IN); close(OUT); sub wanted{ push(@filelist, $File::Find::dir."/$_") unless ($_ =~ /^\.$/); } Perlプログラムで下記の2つのソースを一括置換しようとしてます。 (1) paramIdとparamNameの文字列が同一の場合 <html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Id" onclick="URL">ソース</html:link> (2) paramIdとparamNameの文字列が同一でない場合 <html:link styleClass="push" action="/numa.do" paramId="Id" paramName="Name" onclick="URL">ソース</html:link> やりたいことは ・ html:linkをs:aに変換 ・ styleClassをcssClassに変換(これはわかるのですが位置の修正がわかりません。。) ・ action="/numa.do"を/numaに変換 ・ paramIdとparamNameを文字列が同一か同一でないかで分岐処理したい。 目標は以下のように置換したいです。 (1) paramIdとparamNameの文字列が同一の場合 <s:a href="/numa?Id="%{ Id }" cssClass="push" onclick="URL">ソース</s:a> (2) paramIdとparamNameの文字列が同一でない場合 <s:a href="numa" paramId="Id" paramName="Name" cssClass="push" onclick="URL">ソース</s:a> どうしてもこの置換ができません、、誰かぜひ教えてください。 お願い致します。

    • ベストアンサー
    • Perl
  • Perlの文字列置換について

    質問です。文字列の置換を行いたいのですが、まずはソースから・・・ use File::Basename; use File::Copy; use File::Find; use File::Path; my @filelist = (); $inputfile='C:\Users\test.txt'; $outputfile='C:\Users\test_new.txt'; open (IN, $inputfile) or die "$!"; open (OUT, ">$outputfile") or die "$!"; while(<IN>) { $str = $_; if ($str =~ /html:text/) { $str =~ s/html:text/s:textfield/g; $str =~ s/property/name/; $str =~ s/styleClass/cssClass/; elsif($str =~ /html:textarea/) { $str =~ s/html:textarea/s:textarea/g; $str =~ s/property/name/; $str =~ s/style/cssStyle/; $str =~ s/styleClass/cssClass/; } print OUT $str; } close (IN); close(OUT); sub wanted{ push(@filelist, $File::Find::dir."/$_") unless ($_ =~ /^\.$/); } Perlプログラムで下記のソースを一括置換します。 <html:text property="xxx" styleClass="yyy"> <html:textarea property="abc" styleClass="def" style="ghi"> 目標は以下のように置換したいです <s:textfield name="xxx" cssClass="yyy"> <s:textarea name="abc" cssClass="def" cssStyle="ghi"> しかし、上記のプログラムを実行すると <s:textfield name="xxx" cssClass="yyy"> <s:textfieldarea name="abc" cssClass="def" style="ghi"> となってしまいます。 どこをどう直せばよいのかわからないので誰か教えてください。 お願い致します!!

    • ベストアンサー
    • Perl
  • javaでエンコードがうまくいかない

    ウエダをs-jisにエンコードしたいのですが、うまくいきません。 エンコードフォーム(http://home.kendomo.net/board/decode/decode.php )使用 結果:%83E%83G%83_ java( String urlu = URLEncoder.encode(url , "SJIS");)使用 結果:%83%45%83%47%83%5F エンコードされた出力結果が異なります。 なぜでしょうか? また、エンコードフォームのエンコード形式(SJIS)でエンコードしたいのですが、 どうしたらよいでしょうか? もし、JAVAでできないなら、EXCELやフリーソフトで エンコードしたいのですが、何かよい手はないでしょうか? ご存知の方教えてください。宜しくお願い致します。

    • ベストアンサー
    • Java
  • URLエンコードについて

    「 † 」 の文字をUTF-8 でURLエンコードした時の値が2種類あるんでしょうか。 以下の2つのURLエンコードした文字を %EF%BC%8D %E2%80%A0 URLエンコード/ デコードの結果を出力してくれる こちらのサイトと https://www.tagindex.com/tool/url.html こちらのサイト https://tech-unlimited.com/urlencode.html で結果が異なるみたいです。 なぜこういった結果が異なる状況が生まれるのでしょうか そして正しいのはどちらなのでしょうか

  • perlで新規ファイルを作成できない(文字化け)

    下記、PERLスクリプトを Windows 7+ActivePerl + UTF-8記述状態 で使いたいのですが、どうやら、「爱」が正常に変換されず、?という文字が発生しファイルの作成ができないようです。 普通に、Windows 7上で、$titleの爱愛aiをコピーしてファイルの作成はできるので、Perl上でもこの動作を何とか実現させたいのですが、どのようにすればいいでしょうか? ---test.pl(utf8記述)--- use strict; my $title = "爱愛ai"; # 念のためURLエンコードした物も書いておきます>%E7%88%B1%E6%84%9Bai use Encode; Encode::from_to($title, "utf8", "cp932"); open(F,">$title"); print F $title; close(F); open(F,">title_test.txt"); print F $title; close(F); -------------------------------

    • ベストアンサー
    • Perl
  • Perl utf8上でshiftjisをデコード

    以下の環境にてURLエンコード(shiftjis)された文字を、UTF8として ブラウザに表示させたいのですが、上手く表示されません。 環境: サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。追加モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 実行ソース: ------------------------------------ use utf8; require 'jacode.pl'; # $mojiに予めURLエンコードされた文字が格納されています。 # 例として「マウス」デコード前(%83%7D%83E%83X)とします。 #URLデコード $moji =~ s/%(..)/pack("c",hex($1))/ge;  #デコードされたsjis文字をUTF8へコンバート jcode::convert(\$moji, "utf8","sjis"); print ($moji); ----------------------------------- 例のように「マウス」と言う文字が$mojiに格納されている場合、 以下のような文字化けとなってしまいます。 ツマ燿セツス 正常にマウスと表示させるにはどうすればよろしいのでしょうか。 アドバイスを宜しくお願いします。

    • ベストアンサー
    • Perl
  • substrの文字列の境界の動作について

    perl5.8を使っています。substrの動作について、以下の動作はperlの仕様どおりでしょうか? 以前、どこかのソースで#--1や #--2の場合はundefとなる?のを見た記憶があるのですが、文字列の境界の動作について理解していないのでよろしくお願いいたします。 $|=1; use strict; use Data::Dumper; my $str = "0123456789A"; print Dumper( substr($str, 10, 1) ); # $VAR1 = 'A'; print Dumper( substr($str, 11) ); # $VAR1 = ''; # --1 print Dumper( substr($str, 12) ); # substr outside of string at test.pl line ...  # --2 exit;

    • ベストアンサー
    • Perl
  • エンコードについて

    「タイトル」というテキストを 下記のコードでエンコードすると、 # 検索用エンコード $encode = $code; $encode =~ s/(\W)/'%' . unpack("H2", $1)/eg; $encode =~ tr/ /+/; %83%5e%83C%83g%83%8b となりますが、 %E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB のようにしたいのです。 上記の検索用エンコードをどのように書き換えればできるでしょうか。 似たような記事もありましたが、明確な答えがありませんでした。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字の数え方

     use utf8; を宣言すると、内部に記述されるリテラルにutf8フラグが立てられて、例えばlengthを用いて文字数を数えた場合に、多バイト文字であっても1文字を1とカウントしてくれるそうです。 次のコードでは、文字列の文字数を数えてみました。。   #! /usr/bin/perl   use utf8;   use Encode;   my $str="最初にUTF-8で表示します。次にshift-JISで表示します。";   print length $str;   print "\n";   $str=encode("shiftjis",$str);   print length $str;   print "\n"; 実行結果は以下の通りです。   33   52 文字列がUTF-8の場合は、シングルバイト文字、多バイト文字関係なく1文字で計算するので33文字です。これに対してshift-JISの場合は、多バイト文字を2文字でカウントするので52文字になります。 なるほど。 しかし、次がよく分からないんですけど、   use utf8; をコメントではずすと、その実行結果は以下のようになりました。   71   76 これはどういう計算なのでしょうか?

    • ベストアンサー
    • Perl