これは大きな質問です。調べるには、Devel::Peekを使用して実際に文字列(または他の変数)に何が格納されているのかを少し深めてみてください。
まず
$ perl -MDevel::Peek -E 'Dump "string"'
SV = PV(0x9688158) at 0x969ac30
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x969ea20 "string"\0
CUR = 6
LEN = 12
その後、我々は、Unicode IO層をオンにして、手動でいくつかのワイド文字を追加しようができますから、同じ
$ perl -MDevel::Peek -CSAD -E 'Dump "string"'
SV = PV(0x9eea178) at 0x9efcce0
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x9f0faf8 "string"\0
CUR = 6
LEN = 12
を行うことができますASCII文字列で始まることができます
$ perl -MDevel::Peek -CSAD -e 'Dump "string \x{2665}"'
SV = PV(0x9be1148) at 0x9bf3c08
REFCNT = 1
FLAGS = (POK,READONLY,pPOK,UTF8)
PV = 0x9bf7178 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
これからPerlがこれをutf8として正しく解釈していることがはっきり分かります。問題は、私は表現がより
$ perl -MDevel::Peek -CSAD -E 'Dump "string ♥"'
SV = PV(0x9143058) at 0x9155cd0
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x9168af8 "string \342\231\245"\0
CUR = 10
LEN = 12
すべてのPerlはバイトで見て通常の文字列のように見え、あなたがUnicode文字としてそれらを意味することを知る方法がないエスケープ\x{}
を使用してオクテットを与えていない場合上記のエスケープされたオクテットを入力したときとは異なります。今decode
を使用して
$ perl -MDevel::Peek -CSAD -MEncode=decode -E 'Dump decode "utf8", "string ♥"'
SV = PV(0x8681100) at 0x8683068
REFCNT = 1
FLAGS = (TEMP,POK,pPOK,UTF8)
PV = 0x869dbf0 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
多田を何が起こるか見ることができます!\x{}
エスケープを使用したときに入力した文字列と文字列が正しく内部的に表示されていることがわかりました。
実際の答えは、バイトから文字に「デコード」されていますが、Peekの出力が見えるときにはより意味をなさないと思います。
最後に、あなたはPerlがそう
$ perl -MDevel::Peek -CSAD -Mutf8 -E 'Dump "string ♥"'
SV = PV(0x8781170) at 0x8793d00
REFCNT = 1
FLAGS = (POK,READONLY,pPOK,UTF8)
PV = 0x87973b8 "string \342\231\245"\0 [UTF8 "string \x{2665}"]
CUR = 10
LEN = 12
['perldoc perlguts'](http://perldoc.perl.org/perlguts.html)にはいくつかの情報があります。文字列は通常は魔法ではありません。彼らは時々そうであるように見えるだけです。 –
ありがとうジョン、これまでのところ最高の答えです。 perlgutsは楽しいように聞こえる。そして私を信じてください。私は魔法を信じません。特にPerlに関してはそうです。 – spinkus
[this](http://plosquare.blogspot.in/2009/04/viewing-internal-representation-of.html)も役に立ちました。 –