含表情符号的SQL Server 2016 JSON导出文件UTF-16LE转UTF-8问题
解决iconv转换UTF-16LE到UTF-8时表情符号报错的问题
我之前处理过好几次类似的场景——从SQL Server导出的UTF-16LE JSON文件里,用户输入的emoji经常会搞砸iconv的转换,本质原因是文件里存在不合法的Unicode代理对(4字节emoji在UTF-16里靠一对代理字符表示,要是导出时损坏了其中一个,iconv就会报错)。下面给你几个实用的解决办法:
1. 快速跳过错误:给iconv加-c参数
如果不想纠结坏字符的来源,先拿到可用的UTF-8文件再说,直接用-c让iconv跳过无法转换的字符:
iconv -c -f utf-16le -t UTF-8 table.json > table.utf8.json
这个参数会直接丢弃损坏的字符,优点是快,缺点是你不知道哪些内容丢了,适合紧急处理场景。
2. 更稳妥的修复:用Python处理Unicode错误
Python对Unicode的容错处理比iconv灵活得多,它可以把坏字符替换成占位符(�),既不中断转换,还能标记出问题位置方便后续排查。写个简单的脚本就行:
import codecs # 替换成你的文件路径 input_file = "table.json" output_file = "table.utf8.json" # 读取UTF-16LE文件,自动替换坏字符 with codecs.open(input_file, "r", "utf-16le", errors="replace") as in_f: content = in_f.read() # 写入UTF-8文件 with open(output_file, "w", encoding="utf-8") as out_f: out_f.write(content)
运行后,损坏的位置会显示�,你可以去原文件对应行看看是什么emoji,再回头检查SQL Server里的存储是否有问题。
3. 从源头避免:检查SQL Server的导出和存储设置
最好的办法是不让坏数据产生,你可以从这两点排查:
- 存储字段类型:确保存储用户输入的字段是
nvarchar或ntext(Unicode类型),如果用varchar的话,emoji这类非ASCII字符早就被损坏了,导出自然有问题。 - bcp导出参数:确认bcp命令用了正确的Unicode参数,比如
-w(表示Unicode字符格式,默认就是UTF-16LE),或者明确指定代码页-C 1200(UTF-16LE的代码页编号)。示例bcp命令:
bcp YourDB.dbo.YourTable out table.json -S YourSQLServer -U YourUser -P YourPass -w -t "\n" -r "\n"
如果之前的bcp命令没加-w,可能导出的不是标准UTF-16LE,这才是问题根源。
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

