如何去除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
相关产品推荐
相关产品推荐

