You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除AngularJS从CSV解析的ng-repeat列表中的特殊字符?

解决AngularJS + Papa.Parse解析CSV时特殊字符导致的问号显示问题

问题场景

我在用AngularJS搭配Papa.Parse解析CSV文件,再通过ng-repeat渲染名称数据时碰到了麻烦:CSV里包含用户自行输入的特殊字符,渲染到表格后出现了问号符号(�)。

我的初始实现代码如下:

Papa.Parse("People.csv", { 
  download: true, 
  header: true, 
  skipEmptyLines: 'greedy', 
  complete: function(results) { 
    $scope.items = results.data; 
  } 
}); 
<table> 
  <tr> 
    <th>Name</th> 
  </tr> 
  <tr ng-repeat="item in items"> 
    <td>{{ item.Name }}</td> 
  </tr> 
</table>

踩过的无效坑

一开始我以为是编码问题,给Papa.Parse加了encoding: 'utf-8'配置,但完全没效果;后来尝试用正则替换问号对应的Unicode字符\uFFFD:

item.Name = item.Name.replace(/\uFFFD/g, '');

但这个方法在IE浏览器里不生效,而项目要求必须兼容IE。

最终可行的解决方案

我换了一种思路:只保留指定范围内的合法字符,过滤掉所有不在允许列表里的内容。具体实现如下:

Papa.Parse("People.csv", { 
  download: true, 
  header: true, 
  encoding: 'utf-8', 
  skipEmptyLines: 'greedy', 
  complete: function(results) { 
    $scope.items = results.data; 
    var items = $scope.items; 
    items.forEach(function(item, index) { 
      // 只保留字母、数字、空格、逗号、句号、问号、感叹号,其余字符全部移除
      item.Name = item.Name.replace(/[^a-z0-9 ,.?!]/ig, ''); 
    }); 
  } 
});

这个正则表达式/[^a-z0-9 ,.?!]/ig的逻辑是:

  • ^表示取反,即匹配不在后面字符集合里的内容
  • a-z0-9匹配大小写字母和数字
  • ,.?!匹配空格、逗号、句号、问号、感叹号
  • i表示忽略大小写,g表示全局匹配

这种方式不仅解决了问号乱码问题,还能完美兼容IE浏览器。如果需要支持更多字符(比如中文),只需要把对应的字符范围(比如\u4e00-\u9fa5)加入正则的字符集合即可。

内容的提问来源于stack exchange,提问作者Soul Eater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:23:05