アプリ版:「スタンプのみでお礼する」機能のリリースについて

行き詰まってしまったので教えて下さい。

<やりたいこと>
とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。

<問題>
XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。

<元のXML>
<?xml version="1.0" encoding="Shift_JIS"?>
 <test>
  <prod count=3>
   <record>
    <code>アイウエ</code>
   </record>
   <record>
    <code>カキクケ-</code>
   </record>
   <record>
    <code>ABC</code>
   </record>
  </prod>
 </test>


<XML解析用のコード>
#!usr/bin/perl
use utf8;
use Encode qw/ from_to encode decode /;
use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /;
use LWP::UserAgent;
use XML::Simple;
use Data::Dumper;

#--XML取得部分省略
#--XMLはgetで$xmlに格納

$from = guess_encoding($xml)->name;
&from_to($xml,$from,"utf8");

$XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl';
$xs = new XML::Simple();
$ref = $xs->XMLin($xml);
$xml =~ s/<\?.*\?>//;

for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){
 $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'};
$name = encode('utf-8',$name);
print "$i : $name\n";
}

<結果>
黒ダイヤに?文字で文字化けして出力される。

どなたか原因がお分かりになりますでしょうか。
よろしくお願いいたします。

A 回答 (3件)

ついでに指摘しておくけど,


$xml =~ s/<\?.*\?>//;
ってこのあとで $xml を使っていないから全く無意味だよね.
    • good
    • 0

いや, だから,


from_to は何のため?
って聞いてるんだけど.
    • good
    • 0

ん~, 手元だと <test>, </test> の両タグが落ちてる. なんでだろ....



さておき, from_to は何のため?

あと, 実は元のXML がおかしい気がする.
    • good
    • 0
この回答へのお礼

ありがとうございます。
not well formedが出てしまうので、元のXMLを疑ってみます。
一応
XML::Simple::PREFEERED_PARSER = `XML::SAX::PurePerl`
で上記エラーの回避は可能ですが、今度は途中から文字化けするという謎の現象が起こってしまいます。

もう少し調べてみます。

お礼日時:2013/09/09 22:33

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