encoding.html
来自「perl教程」· HTML 代码 · 共 572 行 · 第 1/3 页
HTML
572 行
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../displayToc.js"></script>
<script language="JavaScript" src="../tocParas.js"></script>
<script language="JavaScript" src="../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../scineplex.css">
<title>encoding - allows you to write your script in non-ascii or non-utf8</title>
<link rel="stylesheet" href="../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',1);</script>
<h1><a>encoding - allows you to write your script in non-ascii or non-utf8</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#abstract">ABSTRACT</a></li>
<ul>
<li><a href="#literal_conversions">Literal Conversions</a></li>
<li><a href="#perlio_layers_for_std_in_out_">PerlIO layers for <code>STD(IN|OUT)</code></a></li>
<li><a href="#implicit_upgrading_for_byte_strings">Implicit upgrading for byte strings</a></li>
</ul>
<li><a href="#features_that_require_5_8_1">FEATURES THAT REQUIRE 5.8.1</a></li>
<li><a href="#usage">USAGE</a></li>
<li><a href="#the_filter_option">The Filter Option</a></li>
<ul>
<li><a href="#filterrelated_changes_at_encode_version_1_87">Filter-related changes at Encode version 1.87</a></li>
</ul>
<li><a href="#caveats">CAVEATS</a></li>
<ul>
<li><a href="#not_scoped">NOT SCOPED</a></li>
<li><a href="#do_not_mix_multiple_encodings">DO NOT MIX MULTIPLE ENCODINGS</a></li>
<li><a href="#tr____with_ranges">tr/// with ranges</a></li>
<ul>
<li><a href="#workaround_to_tr____">workaround to tr///;</a></li>
</ul>
</ul>
<li><a href="#example__greekperl">EXAMPLE - Greekperl</a></li>
<li><a href="#known_problems">KNOWN PROBLEMS</a></li>
<ul>
<li><a href="#the_logic_of__locale">The Logic of :locale</a></li>
</ul>
<li><a href="#history">HISTORY</a></li>
<li><a href="#see_also">SEE ALSO</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<hr />
<h1><a name="name">NAME</a></h1>
<p>encoding - allows you to write your script in non-ascii or non-utf8</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">"greek"</span><span class="operator">;</span> <span class="comment"># Perl like Greek to you?</span>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">"euc-jp"</span><span class="operator">;</span> <span class="comment"># Jperl!</span>
</pre>
<pre>
<span class="comment"># or you can even do this if your shell supports your native encoding</span>
</pre>
<pre>
perl -Mencoding=latin2 -e '...' # Feeling centrally European?
perl -Mencoding=euc-kr -e '...' # Or Korean?</pre>
<pre>
<span class="comment"># more control</span>
</pre>
<pre>
<span class="comment"># A simple euc-cn => utf-8 converter</span>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">"euc-cn"</span><span class="operator">,</span> <span class="string">STDOUT</span> <span class="operator">=></span> <span class="string">"utf8"</span><span class="operator">;</span> <span class="keyword">while</span><span class="operator">(<>){</span><span class="keyword">print</span><span class="operator">};</span>
</pre>
<pre>
<span class="comment"># "no encoding;" supported (but not scoped!)</span>
<span class="keyword">no</span> <span class="variable">encoding</span><span class="operator">;</span>
</pre>
<pre>
<span class="comment"># an alternate way, Filter</span>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">"euc-jp"</span><span class="operator">,</span> <span class="string">Filter</span><span class="operator">=></span><span class="number">1</span><span class="operator">;</span>
<span class="comment"># now you can use kanji identifiers -- in euc-jp!</span>
</pre>
<pre>
<span class="comment"># switch on locale -</span>
<span class="comment"># note that this probably means that unless you have a complete control</span>
<span class="comment"># over the environments the application is ever going to be run, you should</span>
<span class="comment"># NOT use the feature of encoding pragma allowing you to write your script</span>
<span class="comment"># in any recognized encoding because changing locale settings will wreck</span>
<span class="comment"># the script; you can of course still use the other features of the pragma.</span>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">':locale'</span><span class="operator">;</span>
</pre>
<p>
</p>
<hr />
<h1><a name="abstract">ABSTRACT</a></h1>
<p>Let's start with a bit of history: Perl 5.6.0 introduced Unicode
support. You could apply <a href="../lib/Pod/perlvar.html#item_substr"><code>substr()</code></a> and regexes even to complex CJK
characters -- so long as the script was written in UTF-8. But back
then, text editors that supported UTF-8 were still rare and many users
instead chose to write scripts in legacy encodings, giving up a whole
new feature of Perl 5.6.</p>
<p>Rewind to the future: starting from perl 5.8.0 with the <strong>encoding</strong>
pragma, you can write your script in any encoding you like (so long
as the <code>Encode</code> module supports it) and still enjoy Unicode support.
This pragma achieves that by doing the following:</p>
<ul>
<li>
<p>Internally converts all literals (<a href="../lib/Pod/perlfunc.html#item_q_"><code>q//,qq//,qr//,qw///, qx//</code></a>) from
the encoding specified to utf8. In Perl 5.8.1 and later, literals in
<a href="#item_tr_"><code>tr///</code></a> and <code>DATA</code> pseudo-filehandle are also converted.</p>
</li>
<li>
<p>Changing PerlIO layers of <code>STDIN</code> and <code>STDOUT</code> to the encoding
specified.</p>
</li>
</ul>
<p>
</p>
<h2><a name="literal_conversions">Literal Conversions</a></h2>
<p>You can write code in EUC-JP as follows:</p>
<pre>
<span class="keyword">my</span> <span class="variable">$Rakuda</span> <span class="operator">=</span> <span class="string">"\xF1\xD1\xF1\xCC"</span><span class="operator">;</span> <span class="comment"># Camel in Kanji</span>
<span class="comment">#<-char-><-char-> # 4 octets</span>
<span class="regex">s/\bCamel\b/$Rakuda/</span><span class="operator">;</span>
</pre>
<p>And with <code>use encoding "euc-jp"</code> in effect, it is the same thing as
the code in UTF-8:</p>
<pre>
<span class="keyword">my</span> <span class="variable">$Rakuda</span> <span class="operator">=</span> <span class="string">"\x{99F1}\x{99DD}"</span><span class="operator">;</span> <span class="comment"># two Unicode Characters</span>
<span class="regex">s/\bCamel\b/$Rakuda/</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="perlio_layers_for_std_in_out_">PerlIO layers for <code>STD(IN|OUT)</code></a></h2>
<p>The <strong>encoding</strong> pragma also modifies the filehandle layers of
STDIN and STDOUT to the specified encoding. Therefore,</p>
<pre>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">"euc-jp"</span><span class="operator">;</span>
<span class="keyword">my</span> <span class="variable">$message</span> <span class="operator">=</span> <span class="string">"Camel is the symbol of perl.\n"</span><span class="operator">;</span>
<span class="keyword">my</span> <span class="variable">$Rakuda</span> <span class="operator">=</span> <span class="string">"\xF1\xD1\xF1\xCC"</span><span class="operator">;</span> <span class="comment"># Camel in Kanji</span>
<span class="variable">$message</span> <span class="operator">=~</span> <span class="regex">s/\bCamel\b/$Rakuda/</span><span class="operator">;</span>
<span class="keyword">print</span> <span class="variable">$message</span><span class="operator">;</span>
</pre>
<p>Will print "\xF1\xD1\xF1\xCC is the symbol of perl.\n",
not "\x{99F1}\x{99DD} is the symbol of perl.\n".</p>
<p>You can override this by giving extra arguments; see below.</p>
<p>
</p>
<h2><a name="implicit_upgrading_for_byte_strings">Implicit upgrading for byte strings</a></h2>
<p>By default, if strings operating under byte semantics and strings
with Unicode character data are concatenated, the new string will
be created by decoding the byte strings as <em>ISO 8859-1 (Latin-1)</em>.</p>
<p>The <strong>encoding</strong> pragma changes this to use the specified encoding
instead. For example:</p>
<pre>
<span class="keyword">use</span> <span class="variable">encoding</span> <span class="string">'utf8'</span><span class="operator">;</span>
<span class="keyword">my</span> <span class="variable">$string</span> <span class="operator">=</span> <span class="keyword">chr</span><span class="operator">(</span><span class="number">20000</span><span class="operator">);</span> <span class="comment"># a Unicode string</span>
<span class="variable">utf8::encode</span><span class="operator">(</span><span class="variable">$string</span><span class="operator">);</span> <span class="comment"># now it's a UTF-8 encoded byte string</span>
<span class="comment"># concatenate with another Unicode string</span>
<span class="keyword">print</span> <span class="keyword">length</span><span class="operator">(</span><span class="variable">$string</span> <span class="operator">.</span> <span class="keyword">chr</span><span class="operator">(</span><span class="number">20000</span><span class="operator">));</span>
</pre>
<p>Will print <code>2</code>, because <code>$string</code> is upgraded as UTF-8. Without
<code>use encoding 'utf8';</code>, it will print <code>4</code> instead, since <code>$string</code>
is three octets when interpreted as Latin-1.</p>
<p>
</p>
<hr />
<h1><a name="features_that_require_5_8_1">FEATURES THAT REQUIRE 5.8.1</a></h1>
<p>Some of the features offered by this pragma requires perl 5.8.1. Most
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?