skillup

技術ブログ

Perl

Perlの文字コードに関して その1

投稿日:

Perlの文字コードがらみに関して。

何となくやってきたのですが、せっかくなら整理したいのでまとめておきます。

なおPerl自体は5.8.1以降を前提にしたいと思います。

参考資料

業務に役立つPerl

基本期にこの本の要約です。

覚えておきたい用語

バイト文字列

外部から入力された文字列のこと。特定の文字コードで記述されている場合はUTF-8バイト文字列、Shift_JISバイト文字列などと呼びます。他にバイナリ表現、おくてっと文字列、バイトストリーム、バイト列などと呼ばれます。

内部文字列

Perlの内部形式に変換された文字列のこと。他にUnicode文字列、内部表象、内部形式などと呼ばれます。

基本3原則

原則1 外部から入力された文字列はデコードして内部文字列に変換する

外部から入力された文字列はデコードして内部文字列に変換する必要があります。内部文字列に変換するにはEncodeモジュールのdecode関数を使用します。下記ソースは標準入力からデータを受け付けています。

※Data::Dumperだと通常は下記のように化けてしまいます。

バイト文字列 → 内部文字列

原則2 外部へ出力する文字列はエンコードしてバイト文字列に変換する

外部に出力するときはエンコードしてバイト文字列に変換する必要があります。

バイト文字列 ← 内部文字列

原則3 ソースコードはUTF-8で保存し、utf8プラグマを有効にする

最後の原則ですが、ソースコードに書かれた文字列は原則文字列リテラルと呼ばれます。文字列リテラルの文字コードはソースコードを保存したときの文字コードと同じになり、UTF-8バイト文字列になります。

内部文字列に変換するため下記のような処理を書く必要があります。

しかし、上記の記述はやや冗長なため、use utf8と書いてあげると自動的に内部文字列に変換されます。このことをutf8プラグマを有効にする、といいます。

今回は基本原則なのでここまで。次回以降もう少し掘り下げていきます。

-Perl
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Perlでの配列処理

最近Perlでの開発をやっているのでそこでのメモなどを書きます。 今まであまりやったことがなかったんですけど、やはり文字列や配列関連の処理をどうやるのかでいろいろと迷ったりします。 が、もともとテキス …

no image

大容量データの取り込みについて

普段プログラムを組むときには可読性や保守性が大事なポイントになりますが、それと同じぐらい速度やメモリ効率なんかも大事です。 今回は少ないメモリでもなんとかできるような工夫をちょっとかいていこうかなと思 …

no image

Perlにおけるオブジェクト指向

今回はPerlのオブジェクト指向について。 Javaほどの厳密性はありませんが、Perlでもオブジェクト指向的なプログラミングを行うことは可能です。 今回はPerlのオブジェクト指向をさらっと基本的な …

no image

Perlの配列、ハッシュ系の処理 (mapを中心に)

昨日書いたgrepに続き、mapについて調べたことを書いてみました。 Contents1 mapとは?2 mapを使った配列処理 基本3 mapを使った配列、ハッシュ処理 ハッシュを含む多次元配列への …

no image

Perlでの日付処理

Perlで翌月の月末を求め、yyyyMMddで表示する計算があったので対応。 知識がなかったんで何気にちょい時間がかかりました。PerlではこのDateTimeというライブラリがよさげ。 [crayo …