こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

[Perl]XML::SimpleでSJIS

Windows7、ActivePerl v5.24.1を使っています。

use XML::Simple;
use Data::Dumper;

my $data = XMLin('test.xml');
print Dumper($data);

というコードで、以下のXMLファイルを読み込むと、

<?xml version="1.0" encoding="shift_jis"?>
<root>
<top id="1234">
<second>値</second>
<third>
<fourth>1234</fourth>
<fifth>myvalue</fifth>
</third>
</top>
</root>

Couldn't open encmap shift_jis.enc:
No such file or directory
at C:/Perl/lib/XML/Parser.pm line 187.
XML::Simple called at read_xml_test.pl line 10.

というエラーがでます。
ググると、以下のサイトで解決できたという記事がヒットしますが
このサイトはもう存在しません。

Perl XMLでencoding=’Shift_JIS’や’euc-jp’を使う
http://homepage3.nifty.com/hippo2000/perltips/xml/xmlenc.htm

なにかコード間のマップファイルと思われますが、
どなたかお持ちじゃないでしょうか?

投稿日時 - 2018-09-19 12:52:28

QNo.9538833

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

私も探してみましたが、今となっては無理そうですね?

> しかし、ご提示のスクリプトでコード変換をしてXMLinに渡す方は同じエラーがでます。

XML::Simple のマニュアル (http://web.petefinnigan.com/XML-Simple.txt) では、XMLin は「ファイルまたは文字列」を受け付けるとありますが、変数に入った文字列は不可なのかもしれません。ファイルが UTF-8 であれば OK のようですので、1つの一時ファイルを使い回すくらいしかなさそうです?

use Encode;
$file = encode "utf-8", decode("shift_jis", $file);
$file =~ s/shift_jis/utf-8/;
open OUT, ">temp.xml" or die;
print OUT $file;
close OUT;

投稿日時 - 2018-09-22 04:53:41

ANo.1

下記のような記事がありますが、Windows 環境では難しいかもしれません。

http://d.hatena.ne.jp/end0tknr/20080724/1216906738

事前に文字コードと宣言行を utf-8 に変更するとどうなりますか?

use Encode;
$file = encode "utf-8", decode("shift_jis", $file);
$file =~ s/shift_jis/utf-8/;

投稿日時 - 2018-09-20 05:19:11

お礼

ご回答ありがとうございます。

>下記のような記事がありますが、
>http://d.hatena.ne.jp/end0tknr/20080724/1216906738

この記事も見ていましたが、同じサイト(hippo2000)からダウンロードが必要なので...

> 事前に文字コードと宣言行を utf-8 に変更するとどうなりますか?

ファイルそのものに対してutf-8に変更した場合はエラーは回避できました。
しかし、ご提示のスクリプトでコード変換をしてXMLinに渡す方は同じエラーがでます。

対象のファイルが大量にあるのと、Perlで処理をしたのち、SJISのXMLに戻したいという事情もあり、スクリプト内で一時的にutf-8扱いは構わないのですが、入出力時のコードはSJISがいいのです。

何かいい方法はないでしょうか?

投稿日時 - 2018-09-21 12:17:01

あなたにオススメの質問