Archive Redo Blog

DBエンジニアのあれこれ備忘録


テーマ:
他人が作ったPerlのプログラムにSJISの機種依存文字を通すテストしていてトラブルに遭遇しました...

(専門外なので知らなかったのですが)Perlは内部処理をUTF-8で行っているそうです。

そのため、普段Windows上で使っているShift_JISのファイルを扱おうと思ったら、ファイルの読み込み時にUTF-8に変換し、ファイルの出力時に再びShift_JISに変換しなければならないようです。

open(IN, "<:encoding(shiftjis)","$in");

しかし、この時、機種依存文字を含んだShift_JISのファイルを読み込ませるとUnicodeにマッピングできない旨の警告が発生し、

shiftjis "\x87" does not map to Unicode at hoge.pl line 38, <IN> line 12.

そのまま処理は続行されるものの、以下のような感じで化けてしまいます。

\x87@\x87A\x87B\x87C\x87D\x87E ...

この問題は、エンコーディングの指定を"shiftjis"ではなく"cp932"に変えることで解決します。

open(IN, "<:encoding(cp932)","$in");

Perlで言う"shiftjis"はIANA(Internet Assigned Numbers Authority)に登録されている標準のShift_JIS(JISX0201+JISX0208)で、"cp932"はベンダーが独自に拡張した文字を含んだShift_JIS(JISX0201+JISX0208+NEC特殊文字+NEC選定IBM拡張文字+IBM拡張文字)と区別されているようです。

この"CP932"は正式には"Microsoftコードページ932"と呼ばれ、IANAでは"Windows-31J"という名称で登録されています。

ゆえに、WindowsアプリケーションにおいてはShift_JISといえば"CP932"を指すのが一般的となっており、Windowsに慣れ親しんでいるとついつい区別を忘れがちになります。

ましてや機種依存文字など(特に業務システムでは)そう頻繁に使うものではないので、なおさらです。

しかし、Perlに限らずプラットフォームに依存しない言語やソフトウェアの場合は区別されていることも多く、思わぬトラブルを起こしかねないのでやはり注意しておくべきですね。

というか、文字コードや使用可能文字・禁止文字などに関しては、早い段階でビシッと決めておかなければだめですね、本来は...^^;
AD
いいね!した人  |  コメント(0)  |  リブログ(0)

arbさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。