json数据返回格式是&#x53D8这种类型,应该怎么处理转成中文?

调用一个网站接口读取帖子时发现标题名称返回的是变&#x6001这样的类型,该怎么进行处理

阅读 5.5k
4 个回答
// 替换数字为10进制,然后转为字符串
var decode = function(str) {
  return str.replace(/&#x(\w+)/g, function(match, s) {
    return String.fromCharCode(parseInt(s,16));
  });
};
decode('&#x53D8&#x6001');//变态

这个是 XML 字符实体, 他有两种形态 &#XXXX;&#xXXXX; 分别指的是 10 进程和 16 进程.
比较正式的方法是: 把他们用正则替换成 unicode 字符再处理. (伪)


喜欢看文档的戳这里
http://www.w3.org/TR/REC-xml/#sec-physical-struct


没人指出 @苏生 的错误吗? 虽然是可用的, 但是不够严谨.
http://refiddle.com/12q2

  1. 字符匹配
    使用正确字符匹配, 并不能够正确完成.
    (正则分号缺失. 正确字符匹配请戳上面文档)

  2. 匹配不严谨
    a. 无效16进程会被匹配. 例如 &#xS3D8;.
    b. 缺失 10 进程

下面是根据 @苏生 的答案基础修改完成的

decodeER = (string) ->
  return undefined unless string?
  string.replace /&#([0-9]+);/g, (str, p1) ->
    String.fromCharCode p1
  .replace /&#x([0-9a-fA-F]+);/g, (str, p1) ->
    String.fromCharCode parseInt p1, 16

我一直用一种有点 hacking 的方法:

var fakeDecoder = document.createElement('textarea');
fakeDecoder.innerHTML = '&#x6001';
console.log(fakeDecoder.value);    // "变"

不确信这样的方式靠谱不靠谱,也期待比较正经点的解决方案。

这不就是UTF-8形式的汉字吗?
后台直接使用也应该可以吧。
不过,我似乎没遇到过这样UTF-8字符。是不是LZ你没setEncoding啊?
比如:

    var req = https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function(data) {
            var json = JSON.parse(data);
                ...
        })
    });

其实UTF-8也是Unicode的一种啊。
手动把&#x53D8换成\u53D8也应该没问题吧