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
,这是为什么?
问题出在转义字符。注意字符串变量你输入的代码与回显值的区别,比如如果你在控制台打印变量
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'
。如果你这串字符串就是别人传给你的话,那么可以
这样就打印出来
小宝贝syy
ps:
这其实是URI编码解码的问题。URI需要编码解码的原因一个是由于歧义,因为查询字符串部分形式
?foo=1&bar=2
,默认会用'&'和'='来查分URI,而你可能要传的变量值包含&
或者=
,这就产生了URI编码解码的需求。 一般说的字符串编解码是对同一段Buffer用不同的字符集来编码。我个人是这样区分的:
escape
、encodeURI
、encodeURIComponent
都是这个系列的。gbk
编码来解析了,要改成utf8
才能看到(chrome不支持改编码设置了,我用的插件Set Charset Encoding。这在node里是用Buffer
来解决。