[12] Perl の Encode モジュールには「utf8」と「utf-8」
があります。「utf8」は UTF-8 っぽい符号化方式を使った Perl
の内部コード、「utf-8」は Unicode の UTF-8 です。
utf8 符号化[66] Perl の Encode モジュールは文字符号化の名前として
「utf8」 と 「utf-8」に対応しています。
前者は Perl の文字列の内部符号化方式としての UTF-8
(のバイト文字列としての表現)、
後者は Unicode の文字符号化方式である UTF-8 を表しています。
:utf8 PerlIO 層[67] perldoc PerlIO にもちゃんと書いてありましたが、
PerlIO 層 :utf8 を使った入力は不正な入力も黙って受け入れます。
読み込むファイルが UTF-8 として不正なバイト列であったとしても、警告も何も無しで、
黙って utf8 旗を立てた SV にするみたいです。なので、入力が不正なバイト列である可能性がある場合、
:encoding(utf8) を使う必要があります。
こちらは不正なバイト列を \xHH に置き換えるようです。
おそらく :utf8 の方が早いのでしょうが、もし不正なバイト列が混入していた場合、
読み込みの時点では何も起こらず、その後読み込んだ文字列に対して何らかの操作を行おうとした時点で
Malformed UTF-8 character (fatal)
というエラーが出ますので、デバッグが難しくなるかもしれません。
use utf8 (プラグマ)[1] use utf8 プラグマの適用範囲は字句スコープ内全部だと思ってたのですけど、
(クロージャーでない) sub 内には適用されないみたい。
知らんかった。
[2]
でもファイル全体の地の文 (どのブロックより外側) に書いたらその内側の
(クロージャーでない) sub 内にも適用されるよねえ。
ブロック内の use utf8 はそれとは挙動違うんかあ。
[3]
特定の (大域変数ではないが sub にも属さない) 字句変数と
特定の sub にだけ use utf8 したいからブロックで囲って
use utf8 しても思ったように動かなかった次第。
use encoding との関係[4]
use utf8 かどうかと無関係に utf8 扱いしてくれるオプションが文字列リテラルにつくと嬉しいんだけどなあ。
[68] Perl, utf8 フラグ, ハッシュ, リテラル, => - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech ( 版) https://subtech.g.hatena.ne.jp/cho45/20100323/1269329227