js 编码相关问题持续总结

关于URL编码的问题

encodeURI,decodeURI :不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+’,适合对整个url

encodeURIComponent decodeURIComponent : 不会对下列字符编码 ASCII字母 数字 ~!*()’,适合对url参数

content-type

application/x-www-form-urlencoded: body的内容为a=b&c=d,服务端接收时会转为键值对并会把+转成空格,需要对值做encodeURIComponent
application/json: body的内容为JSON.stringify({a:1}})

字符串编码

escape unescape :不会对 ASCII 字母、数字和@/*+进行编码,但已不建议使用

escape和encodeURI区别 :
escape在处理 0xff 之外字符的时候,是直接使用字符的 unicode 在前面加上一个 「%u」
encodeURI 先进行 UTF-8,再在 UTF-8 的每个字节码前加上一个 「%」

nodejs 处理编码文件

iconv-lite: 纯js实现,少了c++到js的转换 比node-iconv快

1
2
3
4
5
6
7
8
9
10
var iconv = require('iconv-lite');
// Convert from an encoded buffer to js string.
str = iconv.decode(buf, 'win1251');
// Convert from js string to an encoded buffer.
buf = iconv.encode("Sample input string", 'win1251');
// Check if encoding is supported
iconv.encodingExists("us-ascii")

encoding: 对node-iconv和iconv-lite的再次封装,encoding首先调用node-iconv,如果node-iconv无法解析,则调用iconv-lite作为替代方案.
encoding模块就一个方法convert(),使用方法为:encoding.convert(text, toCharset, fromCharset)。

  • text: 需要转换的对象,可以为Buffer或者String对象。
  • toCharset: 转换后的编码。
  • fromCharset: 转换前的编码,缺省为uft8。

转换后的输入结果为Buffer对象。

URL、URI、URN

URI:统一资源标识符

URL:统一资源定位器,具体的URI

URN:统一资源命名,如mailto:java-net@java.sun.com