【文字コード】外見上は全く同じなのに生の文字コードが異なるのはなぜ?
文字コードで行き詰まりました。
同じUTF8で全く同じ文字列であるにも関わらず(外見上は全く同じにも関わらず)、2つの生の文字コードが異なるということが起きて、どうしたらいいのかわかりません。
WEBサイトから「あいう」という文字を取り出してきて、そいつの文字コードを、生で表示させました。
すると、
E38182E38184E38186
になります。ところが、perl文の中で$testStr="あいう";
として、そいつを同じように16進数で表示させると、
304230443046
と、違うものになっています。
にも関わらず、「WEBからとってきた文字列」も「perl内で書いた文字列」も両方「Jcode::getcode()」でその文字コードを調べると、utf8になります。
しかも、それら両方とも、print()をすると、同じように「あいう」と表示されます。
「perl内で書いた文字列」の方では、問題なくDBに入れれるのですが、「WEBからとってきた文字列」の方は、文字化けします。
「WEBからとってきた文字列」を「perl内で書いた文字列」のような文字コードに変換するにはどうすればよいのでしょうか?
なぜ同じUTF8として認識されているのでしょうか?
もう気が狂いそうです。
どなたかお助けください。お願いします。
環境
Ubuntu
perl v5.8.8 built for x86_64-linux-gnu-thread-multi
以下は詳しいソースです。
use utf8;#この質問に関係がありそうなモジュールです
use Jcode;
use DBI;
use URI;
use YAML;
use Switch;
use Web::Scraper;
use HTTP::Request::Common;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common qw(POST);
##Webサイトから文字列「あいう」を取得してくる。取得過程は略してます。
$testStrFromWeb=@titleArr[$i];#ちなみにWebサイトの文字コードはUTF8です。
print("testStrFromWeb:".$testStrFromWeb);#「あいう」と表示されます。
##Webサイトから得た文字列「あいう」の生の文字コードを表示。
$strCode=$testStrFromWeb;
$strCode =~ s/(.)/sprintf "%X", ord($1)/eg;
print "$strCode\n";#E38182E38184E38186と表示されます
##Webサイトから文字列「あいう」の文字コードの種類を表示(utf8が返ってくる)
my $getcode = Jcode::getcode(\$testStrFromWeb);
print $getcode ,"\n";#utf8と表示される
##perl内で書いた文字列。
$testStrInPerl="あいう";
print("testStrInPerl:".$testStrInPerl);#「あいう」と表示されます。
##perl内で書いた文字列「あいう」の生の文字コードを表示。
$strCode=$testStrInPerl;
$strCode =~ s/(.)/sprintf "%X", ord($1)/eg;
print "$strCode\n";#304230443046と表示されます
##perl内で書いた文字列「あいう」の文字コードの種類を表示
my $getcode = Jcode::getcode(\$testStrInPerl);
print $getcode ,"\n";#utf8と表示される
ここまで読んでくださってありがとうございます。
お礼
ありがとう