本文内容

  • Unicode 编码
  • 本地 / Unicode
  • 本地 / UTF-8
  • 本地 / ASCII
  • 本地 / URI 编码

Unicode 编码


最近搞蜘蛛程序,经常遇到编码问题,原因有两个:一是各站点所使用的传输编码不同。我特别使用了“传输编码”这个说法,后面会解释;二是站点自己做的手脚。因为,谁也不想自己的资源,被蜘蛛搞走。网络上运行的蜘蛛实在很多。第一个问题很好解决,但是第二个问题,就有点麻烦——做手脚的手段千奇百怪。

本文之所以用 Unicode 开头,而不是 ASCII 或 UTF-8 ,是因为 Unicode 编码包含各个国家的字符(ASCII 当然在其范围),得到系统内核支持,而其他常见编码都是建立在该编码基础上的。应该从两方面认识 Unicode 编码:编码方式和其实现方式。Unicode 对各个国家的字符进行了编码,但未规定它的实现方式。Unicode 实现方式不同于其编码方式。一个字符的 Unicode 编码是确定的。但在实际存储和传输过程中,由于不同系统的设计不一定一致,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为“Unicode 转换格式(Unicode Transformation Format,UTF)”。

实现方式的不同,体现在,比如,用多个字节表示一个汉字,存在字节顺序的问题——大端(Big-Endian,BE)和小端(Little-Endian,LE)。Mac 机是小端,而 Windows 机则是大端。若有十六进制 4E59,Mac 机认为是 594E,汉字为“奎”;而 Windows 机认为是 4E59,汉字为“乙”。再如,Unicode 是定长编码,可一个英文字母用一个字节就能表示,这就存在存储代价。实现时,如 UTF-8 把定长编码变成变长的。这就是为什么 XML 和 HTML 这样需要网络传输的把 UTF-8 作为标准字符集的主要原因。

目前通用的实现方式是 UTF-16 Big-Endian、UTF-16 Little-Endian 和 UTF-8。比如,Windows 7 的 记事本,在“另存为”可以看到四种编码方式:ANSI(即英文系统为 ASCII,中文系统为 GB2312 或 Big5),Unicode(即 UTF-16 Little-Endian)、Unicode big endian(即 UTF-16 Big-Endian)和 UTF-8。

现在,很多浏览器只能显示 UCS-2 完整字符集(Unicode 版本中的一个小子集),这部分是由于 Unicode 版本发展原因。

本地 / Unicode


你可能对“本地”有点迷惑。刚开始,我也不理解,应该是编码之间转换才对。因为本地字符有编码,那么把这个编码转换成 Unicode 编码的说法很合理。其实,所有国家字符的 Unicode 编码都是确定的,无论是你输入的是哪国语。

示例 1:

例子lizi

Unicode 十进制和十六进制编码分别为:

例子lizi
例子lizi

本地到 Unicode 转换的 JavaScript 代码如下所示:

function nativeToUnicode(str) {
    var des = [];
    for (var i = 0; i < str.length; i++)
        des.push("&#" + str.charCodeAt(i) + ";");
        //des.push("&#x" + str.charCodeAt(i).toString(16) + ";");
    return des.join("");
}

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-11-04
  • 2021-09-08
相关资源
相似解决方案