一道Nodejs编码解码问题

var s = '\u5C0F\u5B9D\u8D1Dsyy';
console.log(decodeURIComponent(s))

var userNick = decodeURIComponent('%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy');
console.log(decodeURIComponent( userNick ))

decodeURIComponent('%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy') 解码之后就是变量\u5C0F\u5B9D\u8D1Dsyy,但是在node中执行,却输出不一致,我期望的是能转换成中文,但是下面只是转换成unicode,这是为什么?

阅读 6.2k
2 个回答

问题出在转义字符。注意字符串变量你输入的代码与回显值的区别,比如如果你在控制台打印变量str打印出来是\,那么它其实应该是var str="\\"。同样如果你var str='\\u';console.log(str),你看到的是'''u'''。

你解码的那个字符串本来就是错的,你的代码里没说明'%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy'是怎么得到的,其实你可以验证下'%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy'===encodeURIComponent('\\u5C0F\\u5B9D\\u8D1Dsyy')为true。而实际上你需要的是字符串encodeURIComponent('\u5C0F\u5B9D\u8D1Dsyy'),或者说你直接encodeURIComponent('小宝贝ssy')就行了,因为\u只是个转义字符,会把\u{X} ... \u{XXXXXX}解析成对齐的unicode字符,本质上'\u5C0F\u5B9D\u8D1Dsyy'==='小宝贝ssy'

如果你这串字符串就是别人传给你的话,那么可以

var userNick = decodeURIComponent('%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy');
console.log(eval('"'+decodeURIComponent( userNick )+'"'))

这样就打印出来小宝贝syy

ps:
这其实是URI编码解码的问题。URI需要编码解码的原因一个是由于歧义,因为查询字符串部分形式?foo=1&bar=2,默认会用'&'和'='来查分URI,而你可能要传的变量值包含&或者=,这就产生了URI编码解码的需求。 一般说的字符串编解码是对同一段Buffer用不同的字符集来编码。
我个人是这样区分的:

  • URI编码 为了消除歧义,同时URI传输时只允许ASCII(好像是)。JS中的escapeencodeURIencodeURIComponent都是这个系列的。
  • 字符串内容的编码解码 处理数据流。比如来自网络的数据流,或者读取本地文件等。打开这段js,发现中文部分是乱码,因为传来的数据流被浏览器当作gbk编码来解析了,要改成utf8才能看到(chrome不支持改编码设置了,我用的插件Set Charset Encoding。这在node里是用Buffer来解决。

encodeURIComponent 仅仅能对特殊字符和中文进行转码,且中文的编码的方式是使用utf-8方式,对于字符串'\u5C0F\u5B9D\u8D1Dsyy'来说\是特殊字符,所以就被转义成%5C了。
encodeURIComponent('u5C0Fu5B9Du8D1Dsyy') 就会得到 '%5Cu5C0F%5Cu5B9D%5Cu8D1Dsyy',调用decodeURIComponent就回得到原始字符串,重复调用decodeURIComponent是没有用的,因为第一次decode之后得到的字符串中已经没有特殊字符了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题