Emoji在Layui表格导出CSV时显示为方块或乱码,主因是Excel for Windows默认用GBK解析无BOM的UTF-8 CSV;需手动添加UTF-8 BOM(\uFEFF)并按CSV规范转义含逗号、换行、双引号的字段,或改用SheetJS导出.xlsx文件以原生支持Emoji。
emoji 表情在 layui 表格导出时不会报错,但 excel(尤其是 windows 版)打开后大概率显示为方块、问号或乱码——这不是 layui 的问题,而是 csv 编码与 excel 解析规则冲突导致的。
导出 CSV 时 Emoji 显示为方块或乱码
Excel for Windows 默认用 ANSI(如 GBK)解析无 BOM 的 UTF-8 CSV,而 Emoji 属于 Unicode 补充平面(U+1F600 起),单个 Emoji 常占 4 字节(UTF-8 编码),GBK 完全无法映射,直接 fallback 成 或空格。
- 必须在 CSV 字符串最开头添加 UTF-8 BOM:\uFEFF,强制 Excel 识别为 UTF-8
- 不能只靠
exportFile默认行为——它不自动加 BOM,也不处理 Emoji 特殊性 - 即使加了 BOM,WPS 和部分旧版 Excel 仍可能显示异常;Mac Excel 通常表现更好
table.exportFile() 对含 Emoji 的字段不做转义,但需手动包裹双引号
Emoji 本身不含逗号、换行或双引号,所以一般不会触发 CSV 列错位。但若字段同时含 Emoji + 逗号(如“? 已完成,待归档”),就必须按 CSV 规范处理:
- 检测字段内容是否含
,、"、\n、\r,任一满足就用双引号包裹 - 字段内原有双引号要转义为两个双引号:
"→"" - Emoji 可以原样保留,无需额外编码或替换(如不用 😀)
- 示例清洗函数:
function escapeCsvCell(str) { return /[,\n\r"]/g.test(str) ? '"' + str.replace(/"/g, '""') + '"' : str; }
用 SheetJS 导出真实 Excel(.xlsx)更稳妥
CSV 天然对 Emoji 支持弱,而 xlsx.full.min.js 原生支持 UTF-16 编码,能正确保存和渲染绝大多数 Emoji(包括肤色修饰、家庭组合等复合 Emoji)。
- 引入完整版:
https://cdn.sheetjs.com/xlsx-0.20.2/package/dist/xlsx.full.min.js - 构造二维数组时,Emoji 字符串可直接 push 进去,无需转义
- 务必调用
XLSX.utils.aoa_to_sheet(),不要用json_to_sheet()(后者对 emoji 键名有风险) - 中文表头 + Emoji 内容建议显式设置工作簿属性:
workbook.Props = { CodeName: "Sheet1", LastAuthor: "Layui" };(非必需但减少 Excel 报错概率)
真正难处理的不是 Emoji 本身,而是混合场景:Emoji + 换行符 + 中文标点 + 超长字段——这时连 SheetJS 都可能在 Excel 中折行错位。导出前做最小化清洗(如用 str.replace(/\r\n|\r|\n/g, ' ') 统一换行为空格)比强撑原样更实际。


















