Unity中C#脚本导出CSV时如何正确插入Unicode字符?
解决Unity导出CSV时Unicode字符(如Δ)乱码的问题
这个问题我之前帮不少开发者解决过——本质是编码不匹配导致的乱码,尤其是CSV在Excel这类工具里的显示问题。当你用默认的StreamWriter创建文件时,它会使用系统默认编码(比如Windows-1252),而Unicode字符(像Δ)在这种编码下无法正确解析,就会变成∆这类乱码。
核心解决方案:使用带BOM的UTF-8编码写入CSV
Excel默认不会自动识别UTF-8编码的CSV,除非文件开头带有UTF-8 BOM(字节顺序标记)。所以我们需要明确指定StreamWriter使用带BOM的UTF-8编码来写入文件。
完整代码示例
下面是Unity中可以直接使用的C#脚本示例,演示如何正确导出包含Unicode字符的CSV:
using System.IO; using System.Text; using UnityEngine; public class CSVExporter : MonoBehaviour { // 可以在Unity编辑器中通过按钮调用这个方法 public void ExportDataToCSV() { // 定义CSV文件路径,这里用Unity的持久化数据路径 string csvPath = Path.Combine(Application.persistentDataPath, "height_data.csv"); // 关键:使用带BOM的UTF-8编码创建StreamWriter // Encoding.UTF8在.NET中默认会添加BOM,确保Excel能识别编码 using (StreamWriter writer = new StreamWriter(csvPath, false, Encoding.UTF8)) { // 直接写入包含Δ的表头字符串 writer.WriteLine("Δ Height,Measurement,Timestamp"); // 示例数据行 writer.WriteLine("2.1,150,2024-05-20 14:30"); writer.WriteLine("-0.8,148,2024-05-20 14:35"); writer.WriteLine("1.3,151,2024-05-20 14:40"); } Debug.Log($"CSV文件已成功导出至:{csvPath}"); } }
为什么这样能解决问题?
- UTF-8编码:支持所有Unicode字符,包括Δ这类特殊符号,确保字符本身不会被转义或损坏。
- UTF-8 BOM:Excel需要这个标记来识别文件是UTF-8编码,否则会用系统默认编码读取,导致Unicode字符解析成乱码。
额外注意事项
- 如果你用Notepad++或其他代码编辑器打开CSV,即使不带BOM也能正常显示UTF-8字符,但Excel必须依赖BOM才能正确识别。
- 不要使用
Encoding.Default,它会根据系统区域选择编码,在不同设备上可能导致不一致的乱码问题。
内容的提问来源于stack exchange,提问作者Omar Ilyas
相关产品推荐
相关产品推荐

