← 中文资源

简体中文版本

安全导出 CSV 的字段转义

对包含分隔符、双引号、换行或首尾空白的 CSV 字段加引号并双写内部引号,普通值保持原样。

阅读英文原文

功能说明

导出 CSV 时,字段中的逗号、双引号、换行和首尾空格会破坏列结构。该函数按 RFC 4180 规则判断是否需要引号,并用双写方式转义内部引号,普通值保持原样。toCsvRow 可以直接把一行数据转换为可写入文件的字符串,适合报表和导出功能。

关键代码

null 与 undefined 转为空字符串。needsQuotes 检查分隔符、双引号、CR/LF 以及首尾空白。需要引用时用双引号包裹并把每个双引号替换为两个。toCsvRow 对每个值调用后按分隔符连接,分隔符必须是单个字符。

const needsQuotes =
  text.includes(delimiter) || text.includes('"') ||
  /[\r\n]/.test(text) || /^\s|\s$/.test(text);
if (!needsQuotes) return text;
return '"' + text.replace(/"/g, '""') + '"';

使用注意

该函数只转义单个字段,不生成表头,也不处理公式注入。以等号、加号、减号或 @ 开头的值可能被表格软件当作公式执行,需要额外防护。分隔符必须是单个字符,否则抛 RangeError。首尾空白会被保留在引号内,不会自动裁剪。

验证方式

断言 escapeCsvField(“a,b”) 返回带引号的 “a,b”,内部双引号被双写。含换行与首尾空格的字段触发引用,普通文本不加引号。null 与 undefined 返回空字符串。toCsvRow([1, “a,b”, null]) 应正确连接三列。分隔符长度不为 1 抛 RangeError。