<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> の <code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Encode</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">モジュール</anchor>には「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor>」と「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf-8</anchor>」
があります。「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor>」は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> っぽい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化方式</anchor>を使った <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部コード</anchor>、「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf-8</anchor>」は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> です。</p><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Unicodeの符号空間</anchor> </sw-see></p><section><h1>utf8 旗と utf8 文字列</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">・・・</ed></section><section><h1><code class="perl" xml:lang="en">utf8</code> 符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="66" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[66]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> の <code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Encode</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">モジュール</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>の名前として
「<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code>」 と 「<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf-8</anchor></code>」に対応しています。
前者は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号化</anchor>方式としての <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor>
(の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト文字列</anchor>としての表現)、
後者は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化方式</anchor>である <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> を表しています。</p></section><section><h1><code class="perl" xml:lang="en">:utf8</code> PerlIO 層</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="67" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[67]</anchor-end> <kbd xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">perldoc</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PerlIO</anchor></kbd> にもちゃんと書いてありましたが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PerlIO</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">層</anchor> <code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code> を使った入力は不正な入力も黙って受け入れます。
読み込むファイルが <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> として不正な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>であったとしても、警告も何も無しで、
黙って <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">旗</anchor>を立てた SV にするみたいです。なので、入力が不正なバイト列である可能性がある場合、
<code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding</anchor>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor>)</code> を使う必要があります。
こちらは不正なバイト列を <code class="example">\x<var>HH</var></code> に置き換えるようです。</p><p>おそらく <code class="perl" xml:lang="en">:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf8</anchor></code> の方が早いのでしょうが、もし不正なバイト列が混入していた場合、
読み込みの時点では何も起こらず、その後読み込んだ文字列に対して何らかの操作を行おうとした時点で
<q xml:lang="en">Malformed UTF-8 character (fatal)</q>
というエラーが出ますので、デバッグが難しくなるかもしれません。</p></section><section><h1>EBCDIC 環境との関係</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">・・・</ed></section><section><h1><code>use utf8</code> (プラグマ)</h1><section><h1>適用範囲</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <code>use utf8</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラグマ</anchor>の適用範囲は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字句スコープ</anchor>内全部だと思ってたのですけど、
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クロージャー</anchor>でない) <code>sub</code> 内には適用されないみたい。
知らんかった。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> 
でもファイル全体の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">地の文</anchor> (どの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>より外側) に書いたらその内側の
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クロージャー</anchor>でない) <code>sub</code> 内にも適用されるよねえ。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>内の <code>use utf8</code> はそれとは挙動違うんかあ。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 
特定の (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">大域変数</anchor>ではないが <code>sub</code> にも属さない) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字句変数</anchor>と
特定の <code>sub</code> にだけ <code>use utf8</code> したいから<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor>で囲って
<code>use utf8</code> しても思ったように動かなかった次第。</p></section><section><h1><code class="perl" xml:lang="en">use encoding</code> との関係</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">・・・</ed></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 
<code>use utf8</code> かどうかと無関係に <code>utf8</code> 扱いしてくれるオプションが<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列リテラル</anchor>につくと嬉しいんだけどなあ。</p></section></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[68]</anchor-end> <cite>Perl, utf8 フラグ, ハッシュ, リテラル, =&amp;gt; - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech</cite>
(<time>2010-03-25 09:56:06 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://subtech.g.hatena.ne.jp/cho45/20100323/1269329227">https://subtech.g.hatena.ne.jp/cho45/20100323/1269329227</anchor-external></p></section></body></html>