JavaScript实验:Unicode字符串长度

根据ECMAScript标准的要求,JavaScript对Unicode字符提供了支持。因此,以下JavaScript语句是合法的:

//saved in test.js file with UTF-8 encoding.
var name = "测试";  
alert(name.length);  

如果在运行JavaScript程序时所用的编码为Unicode(比如UTF-8)且与字符串的编码格式一致,那么当对含有Unicode字符的字符串取长度时,每一个Unicode字符的长度为1;在上面的例子中,name.length所返回的结果为2。如果运行JavaScript程序时所使用的编码不是Unicode(比如ISO-8859-1),或者运行时所采用的Unicode编码与字符串编码格式不一致,那么每个Unicode字符的长度可能会大于1;在上面的例子中,如果运行时所使用的编码为ISO-8859-1,则name.length所返回的结果为6(每个中文字符长度为3)。

运行JavaScript程序时的编码

运行JavaScript程序时的编码与.js文件的编码保存格式无关,该运行时编码状态仅由以下两个因素决定:

  1. 浏览器打开网页时所采用的编码格式。
  2. 引入js文件时所指定的编码格式。

如果上面2个因素发生冲突,程序将以引入js文件时所指定的编码格式为准。

以下面的HTML文件为例:

<html>  
<head>  
<script type="text/javascript" src="test.js"></script>  
</head>  
<body>  
</body>  
</html>  

由于该HTML文件未指定任何编码信息,因此浏览器将以ISO-8859-1编码格式打开这个网页。虽然test.js文件是由UTF-8所编码的,但由于浏览器使用ISO-8859-1编码打开网页,因此在执行test.js文件中的JavaScript代码时,所使用的编码也是ISO-8859-1。代码执行的最终结果为:name.length返回6。

如果需要用UTF-8编码来运行JavaScript程序,可以在HTML网页中定义该页面的编码:

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
<script type="text/javascript" src="test.js"></script>  
</head>  
<body>  
</body>  
</html>  

此时,test.js程序执行后name.length将返回2。

如果无法更改页面编码,那么可以通过在引入js文件时指定运行时编码格式来解决这一问题:

<html>  
<head>  
<script type="text/javascript" chartset="UTF-8" src="test.js"></script>  
</head>  
<body>  
</body>  
</html>  

此时,尽管浏览器依然会以ISO-8859-1打开网页,但在执行test.js时所采用的编码格式为UTF-8,因此name.length返回结果为2。

由此可见,如果Web开发过程中涉及Unicode字符(比如:中文网站的开发),那么最好在所有的HTML页面文件上加入编码信息。

JavaScript程序中Unicode字符的表示

除了直接使用Unicode字符,JavaScript程序中还可以使用\u转义符。比如test.js就可以写成:

var name = "\u6d4b\u8bd5";  
alert(name.length);  

最终name.length所返回的结果仍为2。

对于使用\u转义符这一方式,个人的看法是:该方法会对程序的易读性造成极大的影响,因此除非开发环境不允许直接输入Unicode字符,不然不应采取这种方式。