<blockquote>
<p>I am confused that why the len of s is 1, how could 4e25 be stored in 1 byte? I also notice that USC-2 is 2-bytes long and USC-4 is 4-bytes long, why unicode string s's length is 1?</p>
</blockquote>
<p>unicode字符串的全部目的就是这样做。unicode字符串的长度是<em>字符数</em>(即,代码点),而不是字节数。字节数可能因编码而异,但字符数是一个抽象的不变量,不会随编码而改变。</p>
<p>至于第二个问题,答案是在设置文件的编码时,告诉Python如何将该文件中的字节映射到字符。如果指定的编码(使用<code># encoding</code>语法)与文件的实际编码不一致,则会出现不可预测的行为,因为Python试图以一种方式解释字节,但文件的设置使字节实际上意味着其他东西。</p>
<p>您得到的行为类型将取决于您使用的编码的具体情况。一些可能性是:</p>
<ol>
<li>你会很幸运,即使你使用了相互冲突的编码,它也会起作用;这是在你的第一个案例中发生的。</li>
<li>它将引发一个错误,因为文件中的字节与指定的编码不一致;这是在第二种情况下发生的情况。</li>
<li>它似乎可以工作,但会产生不同的字符,因为文件实际编码中的字节在用指定编码解释时意味着其他一些东西。这似乎是在您的第三种情况下发生的,尽管它应该会引发一个错误,因为该字符不是ASCII。(所谓“文件的编码样式是UTF-8”是指在文件中设置了一个<code># encoding</code>指令吗?)</li>
<li>如果不指定任何编码,如果尝试使用非纯ASCII格式的任何字节,则会出现错误。这就是你上次的案子。</li>
</ol>
<p>而且,在所有情况下,字符串的类型都是<code>str</code>,因为您没有将字符串指定为unicode(例如,使用<code>u"..."</code>)。指定文件编码不会使字符串成为unicode。它只是告诉Python如何解释文件中的字符。</p>
<p>然而,这里还有一个更大的问题,那就是:你为什么要用你的例子中的编码来玩那些游戏?没有任何理由使用<code># encoding</code>标记来指定文件实际编码之外的编码,这样做肯定会导致问题。别这么做。您必须知道文件的编码方式,并在<code># encoding</code>标记中指定相同的编码方式。</p>