本文内容

  • 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("");
}

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

function unicodeToNative(str) {
    var src = str.match(/&#(\d+);/g);
    if (src != null) {
        var des = [];
        for (var i = 0; i < src.length; i++)
            des.push(String.fromCharCode(src[i].replace(/[&#;]/g, "")));
        return des.join("");
    }
    return "";
}

说明:

  • String.charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
  • String.fromCharCode() 方法可接受一个指定的 Unicode 值,然后返回一个字符串。

本地 / UTF-8


UTF-8 是 Unicode 的实现方式之一,把定长编码改成变长的,减少了存储和传输的开销。从下面示例可以看到,中文是编码,而对用一个字节就能表示的英文字符,没有变化。

示例 2:

例子lizi

UTF-8 编码为:

例子lizi

本地转换 UTF-8 的 JavaScript 代码如下所示:

function navtiveToUTF8(str) {
    return str.replace(/[^\u0000-\u00FF]/g, function ($0) { return escape($0).replace(/(%u)(\w{4})/gi, "&#x$2;") });
}

UTF-8 转换本地的 JavaScript 代码如下所示:

function utfToNative(str) {
    return unescape(str.replace(/&#x/g, '%u').replace(/;/g, ''));
}

说明:

  • escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
  • unescape() 函数可对通过 escape() 编码的字符串进行解码。

本地 / ASCII


示例 3:

例子lizi

ASCII 码转换或不转换 ASCII 的编码为:

\u4f8b\u5b50lizi

\u4f8b\u5b50\u006c\u0069\u007a\u0069

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

function nativeToASCII(str, isIgnoreLetter) {
    var character = str.split("");
    var ascii = [];
    for (var i = 0; i < character.length; i++) {
        var code = Number(character[i].charCodeAt(0));
        if (!isIgnoreLetter || code > 127) {
            var charAscii = code.toString(16);
            charAscii = new String("0000").substring(charAscii.length, 4) + charAscii;
            ascii.push("\\u" + charAscii);
        }
        else {
            ascii.push(character[i]);
        }
    }
    return ascii.join("");
}

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

function asciiToNative(str) {
    var character = str.split("\\u");
    var res = character[0];
    for (var i = 1; i < character.length; i++) {
        var code = character[i];
        res += String.fromCharCode(parseInt("0x" + code.substring(0, 4)));
        if (code.length > 4) {
            res += code.substring(4, code.length);
        }
    }
    return res;
}

本地 / URI 编码


URI 编码不用以上编码,它的主要是出于安全性考虑,让链接的内容不能一目了然地看到是什么,防止恶意的偷看者。下面是 cnblogs 的“找找看”检索链接,对其进行编码。

示例 4:

http://zzk.cnblogs.com/s?w=例子lizi&t=

URI 编码和组件编码分别为:

http://zzk.cnblogs.com/s?w=%E4%BE%8B%E5%AD%90lizi&t=

http%3A%2F%2Fzzk.cnblogs.com%2Fs%3Fw%3D%E4%BE%8B%E5%AD%90lizi%26t%3D

说明:

  • encodeURI() 函数可把字符串作为 URI 进行编码。
  • decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。
  • encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
  • decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

下载 Demo

转载于:https://www.cnblogs.com/liuning8023/archive/2012/12/09/2810518.html

JavaScript——编码问题相关推荐

  1. JavaScript编码风格指南

    首次发表在个人博客 前言 程序语言的编码风格指南对于一个长期维护的软件而言是非常重要的;好的编程风格有助于写出质量更高.错误更少.更易于 维护的程序. 团队合作需要制定一些代码规范还有利用一些工具来强 ...

  2. Airbnb JavaScript 编码风格指南(2018年最新版)

    Airbnb JavaScript 编码风格指南(2018年最新版) 访问此原文地址:http://galaxyteam.pub/didi-fe... 另外欢迎访问我们维护的https://www.t ...

  3. 一些达成共识的JavaScript编码风格约定

    如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...

  4. JavaScript编码规范[百度]

    JavaScript编码规范 1 前言 2 代码风格 2.1 文件 2.2 结构 2.2.1 缩进 2.2.2 空格 2.2.3 换行 2.2.4 语句 2.3 命名 2.4 注释 2.4.1 单行注 ...

  5. JavaScript 编码规范大全-Eslint(持续更新,欢迎关注点赞加评论)

    JavaScript 编码规范大全(持续更新,欢迎关注点赞加评论) 文章目录 JavaScript 编码规范大全(持续更新,欢迎关注点赞加评论) 前言 0. 相关工具 1. 类型 2. 引用 3. 对 ...

  6. 网易前端JavaScript编码规范

    在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享.今天想先和大家聊 ...

  7. javascript 编码_我们的1,600小时JavaScript编码课程

    javascript 编码 by freeCodeCamp 通过freeCodeCamp 我们的1,600小时JavaScript编码课程 (Our 1,600 Hour JavaScript Cod ...

  8. JavaScript => JavaScript编码规范指南

    JavaScript 编码规范指南 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 对于未提及的事项可以参考airbnb的JS编码规范 airbnb/j ...

  9. javascript编码规范

    一.前言 如果你写的代码只是给自己看,不需要与多人共同协作:如果你写的代码不打算开源:如果你不进行code review:如果你不打算担任前端工程师这一岗位,只是单纯业余爱好:满足以上任一条件,我建议 ...

  10. Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!...

    1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...

最新文章

  1. 基于ASP.Net Core开发的一套通用后台框架
  2. allocator_is_always_equal的实例
  3. 剑指offer之61-66题解
  4. 移动磁盘文件或目录损坏且无法读取资料如何找回
  5. Linux操作系统的8个经典技巧
  6. 终于在五一之前打了SP3
  7. EXCEL 制作下拉选项,限制输入内容范围
  8. Java String 类型对象不能改变
  9. numpy与tensorflow中的广播(broadcast)机制
  10. JAVA----简单的自旋锁
  11. 浅谈下对volatile的理解
  12. 《Java核心技术36讲》读后
  13. 相位一致性的基本原理及应用问题
  14. 微信小程序--云开发静态网站h5跳小程序
  15. [Matlab] 单次测量的中误差、算数平均值的中误差、加权求最或然值、函数拟合、莫迪图的计算实例
  16. 以下产品不用再做CCC认证了,你的产品在内吗?
  17. Spring -> Spring Boot、Spring MVC 和 Spring 有什么区别
  18. 自定义监控项及告警升级
  19. tensorflow的安装和求解泊松方程
  20. SparkStreaming面试题

热门文章

  1. Java B2B2C o2o多用户商城 springcloud架构-docker-feign-hystrix(六)
  2. 《Objective-C开发经典教程》
  3. (六)api网关服务 zuul-过滤器
  4. dockerfile 创建Jenkins镜像
  5. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
  6. SATA硬盘检测修复及MHDD的一些使用详解
  7. Web前端笔记(5)
  8. Python中字典的增、删、查
  9. Linux之硬件资源管理
  10. 对一个三角形三边如何设计测试用例等价类经典应用