文字エンコードと掛けまして、
自家用車と、ときます。
そのココロは・・・
シフト(shift-jis)はもう古い。
ナンチャッテ・エンジニアのユゲタです。
先日、xmllintが便利だというブログを書いたんですが、使っていてどう考えてもバグを発見したので、お伝えします。
xmllint学習 #1 サーバーコマンドでxmlをパースできるxmllintが便利っぽい
事象
xmllintは、--encodeオプションで、文字エンコードを指定することができるんですが、
--xpathオプションを使うと、encodeが機能しないという事が判明しました。
サンプルとして、以下のxmlを読み込んでみました。
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 -
<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" version="2.0">
<channel>
<title>9chat-e ナンチャッテ・ラジオ</title>
<link>http://9chat-e.mynt.work/</link>
<description>プログラミング学習に役立つ情報を、ナンチャッテ・エンジニアがお伝えするラジオ番組</description>
<language>ja</language>
<docs>http://9chat-e.mynt.work//?f=rss_radio</docs>
<itunes:author>9chat-e</itunes:author>
<itunes:image href="http://9chat-e.mynt.work//page/radio/img/banner/podcast_banner.jpg"/>
<itunes:owner>
<itunes:email>9chat-e@mynt.work</itunes:email>
<itunes:name>9chat-e</itunes:name>
</itunes:owner>
<itunes:summary>プログラミング学習に役立つ情報を、ナンチャッテ・エンジニアがお伝えするラジオ番組</itunes:summary>
<itunes:category text="Technology">
<itunes:category text="Education"/>
</itunes:category>
<itunes:explicit>yes</itunes:explicit>
<googleplay:author>9chat-e</googleplay:author>
<googleplay:image href="http://9chat-e.mynt.work//page/radio/img/banner/podcast_banner.jpg"/>
<googleplay:owner>
<googleplay:email>9chat-e@mynt.work</googleplay:email>
<googleplay:name>9chat-e</googleplay:name>
</googleplay:owner>
<googleplay:summary>プログラミング学習に役立つ情報を、ナンチャッテ・エンジニアがお伝えするラジオ番組</googleplay:summary>
<googleplay:category text="Technology">
<googleplay:category text="Education"/>
</googleplay:category>
<googleplay:explicit>yes</googleplay:explicit>
<item>
<title>#004 初心者向けプログラミング言語について</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=4</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/4.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 24 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
- chapter-1
ワンポイントアドバイスのコーナー
「プログラム言語についてのお話」
- chapter-2
質問のコーナー
「iOSのwebviewにて位置情報の確認ダイアログが何度も出る...」
- chapter-3
トライアルのコーナー
「環境構築その2」</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/4.mp3</guid>
</item>
<item>
<title>#003 フローチャートについて</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=3</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/3.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 17 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
chapter-1
番組開始の挨拶
chapter-2
QAのコーナー
chapter-3
トライアルのコーナー
</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/3.mp3</guid>
</item>
<item>
<title>#002 プログラムは数学ではなく国語で考えろ!</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=2</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/2.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 10 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>chapter-1
プログラミング学習アドバイス
chapter-2
QAのコーナー
capter-3
トライアルのコーナー</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/2.mp3</guid>
</item>
<item>
<title>#001 ナンチャッテ・ラジオ 始まるよ!</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=1</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/1.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 03 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
chapter-1
番組開始の挨拶
chapter-2
QAのコーナー
chapter-3
トライアルのコーナー
</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/1.mp3</guid>
</item>
</channel>
</rss>
この中のitemタグを絞り込もうとxpathを使うと・・・
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 --xpath "//*[local-name()='item']" -
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 --xpath "//*[local-name()='item']" -<item>
<title>#004 初心者向けプログラミング言語について</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=4</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/4.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 24 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
- chapter-1
ワンポイントアドバイスのコーナー
「プログラム言語についてのお話」
- chapter-2
質問のコーナー
「iOSのwebviewにて位置情報の確認ダイアログが何度も出る...」
- chapter-3
トライアルのコーナー
「環境構築その2」</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/4.mp3</guid>
</item><item>
<title>#003 フローチャートについて</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=3</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/3.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 17 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
chapter-1
番組開始の挨拶
chapter-2
QAのコーナー
chapter-3
トライアルのコーナー
</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/3.mp3</guid>
</item><item>
<title>#002 プログラムは数学ではなく国語で考えろ!</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=2</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/2.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 10 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>chapter-1
プログラミング学習アドバイス
chapter-2
QAのコーナー
capter-3
トライアルのコーナー</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/2.mp3</guid>
</item><item>
<title>#001 ナンチャッテ・ラジオ 始まるよ!</title>
<link>http://9chat-e.mynt.work/?c=radio/contents&id=1</link>
<enclosure url="http://9chat-e.mynt.work//data/9chat_e/radio/1.mp3" length="" type="audio/mpeg"/>
<pubDate>Mon, 03 Feb 2020 08:00:00 +0900</pubDate>
<itunes:author>9chat-e</itunes:author>
<description>プログラミング学習に役立つ情報をお伝えするラジオ番組
chapter-1
番組開始の挨拶
chapter-2
QAのコーナー
chapter-3
トライアルのコーナー
</description>
<guid>http://9chat-e.mynt.work//data/9chat_e/radio/1.mp3</guid>
</item>
文字コード化したデータをブラウザで表示すると、ブラウザのオートエスケープ機能が働いて、正常に見えるんですが、コマンドを叩いたら、上記のようになるので、非常に困惑します。
解決への道
ひとまず、nkfコマンドで、文字エンコード状態を調べてみましょう。
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 -| nkf -g
> UTF-8
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 --xpath "//*[local-name()='item']" -| nkf -g
> ASCII
見事に、UTF-8からASCIIに切り替わっていることが分かります。
でも、
$ curl http://9chat-e.mynt.work/?f=rss_radio | xmllint --encode utf-8 - | nkf -W8 | nkf -g
> UTF-8
無事に変換できたかと思っても、コード表示は変わっていません。
ファイルのエンコードが変わっただけのようです。
コマンド操作だけでは、これが限界なのか?
この先は、phpなどで変換したほうがいいかもですね。
0 件のコメント:
コメントを投稿