文件编码须显式指定utf-8且无bom;换行符统一用 ;二进制数据需注意字节序、时间戳转unix毫秒、浮点数用Float/double;路径与文件名须过滤非法字符并归一化分隔符。

文件编码必须显式指定为UTF-8,且不带BOM
python和java默认读取文本文件时,对BOM(Byte Order Mark)处理不一致:Python open() 在windows下可能误判编码,Java的Files.readAllLines() 会把BOM当普通字符读入。C#里用File.WriteAllText()或StreamWriter默认可能写入UTF-8 BOM。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 写文本文件时,用
new StreamWriter(path, false, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)) - 或直接用
File.WriteAllBytes(path, Encoding.UTF8.GetBytes(content))绕过StreamWriter - 避免用
File.WriteAllText(path, content)——它在.NET Framework下默认带BOM,.NET Core/.NET 5+ 默认不带,但行为跨版本不稳
换行符统一用 ,别依赖Environment.NewLine
Windows下Environment.NewLine是 ,而Python在Unix/linux/macos上用open()读 会保留 ,Java的BufferedReader虽能自动处理,但逐行解析时若混用换行符,会导致字段错位(尤其CSV/TSV场景)。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 所有文本输出中,手动替换
content.Replace(Environment.NewLine, " ") - 写日志、配置、json、CSV等结构化文本时,直接用
" "拼接,不用StringBuilder.AppendLine() - 如果必须用
StreamWriter,构造时传new StreamWriter(..., leaveOpen: true) { NewLine = " " }
二进制文件注意字节序与数据类型对齐
C#的BinaryWriter默认用小端序(Little-Endian),且int是4字节、long是8字节——这和Java的DataOutputStream一致,但Python的Struct.unpack()需显式指定(小端)或<code>>(大端)。另外,C#的DateTime不能直接写进二进制流供其他语言解析。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 时间戳统一存为
long类型的Unix毫秒时间(DateTime.UtcNow.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds) - 浮点数优先用
float(4字节)或double(8字节),避免decimal——Python/Java无直接对应类型 - 写二进制前,用
BitConverter.IsLittleEndian校验,确保环境一致;跨平台分发时,干脆强制用BitConverter.GetBytes(value).Reverse().ToArray()转大端(并文档注明)
路径分隔符和文件名字符要避开各语言敏感区
C#在Windows上允许:、*、?等字符出现在路径里(NTFS支持),但Python的os.path和Java的Paths.get()在多数运行时会直接抛InvalidPathException或OSError。另外,Unicode组合字符、零宽空格、控制字符在C#里能创建成功,但在Python 3.12之前某些文件系统封装层会静默截断。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 文件名生成时用正则过滤:
Regex.Replace(name, @"[/:*?""|^u200b-u200fu202a-u202e]", "_") - 路径拼接一律用
Path.Combine(),但最终保存前用path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)归一化为/或(推荐/,Python/Java都兼容) - 避免用
DateTime.ToString("o")作文件名——其中的:和.在Windows命令行里易出问题;改用ToString("yyyyMMddHHmmssfff")
最麻烦的其实是隐式行为:比如C#里File.WriteAllText()没指定编码时的版本差异、Python读文件时未声明encoding="utf-8"导致的乱码、Java里FileReader用平台默认编码硬解UTF-8内容……这些不会报错,只会让数据悄悄变形。