You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:读取文件后如何去除字符串中的\0,获取正常内容?

解决读取文件时字符串含'\0'的问题

看起来你遇到的是编码不匹配或者字节数组末尾补零导致的问题,出现M\0M\0M\0\0\0这种情况,大概率是因为写入文件时用了UTF-16(Unicode)编码——这种编码下每个ASCII字符会占用2个字节,其中高字节是\0,再加上原propItem.Value可能有固定长度的字节数组,末尾补了额外的\0,就出现了现在的结果。

给你几个针对性的解决方案:

方案1:用正确编码读取后去除末尾空字符

如果写入时确实用的是UTF-16编码,读取时可以先解码,再去掉末尾的\0:

// 读取文件字节
byte[] fileBytes = File.ReadAllBytes("你的文件路径");
// 用Unicode编码解码,再Trim掉所有末尾的空字符
string cleanStr = Encoding.Unicode.GetString(fileBytes).TrimEnd('\0');

方案2:统一用UTF-8编码写入和读取

如果不需要用UTF-16,建议全程用UTF-8编码(单字节存储ASCII字符,不会产生\0),修改写入和读取的代码:

写入时(补充你的逻辑):

if (textBox1.Text.Contains("MMM"))
{
    string targetStr = textBox1.Text;
    // 用UTF-8转成字节数组
    byte[] bytesToSave = Encoding.UTF8.GetBytes(targetStr);
    // 保存到文件
    File.WriteAllBytes("你的文件路径", bytesToSave);
}

读取时:

byte[] fileBytes = File.ReadAllBytes("你的文件路径");
string cleanStr = Encoding.UTF8.GetString(fileBytes);

方案3:截取到第一个空字节前的有效内容

如果不确定写入编码,或者字节数组里只有前面的部分是有效字符串,后面都是补的\0,可以找到第一个\0的位置,截取有效部分再解码:

byte[] fileBytes = File.ReadAllBytes("你的文件路径");
// 找到第一个空字节的索引
int nullPos = Array.IndexOf(fileBytes, (byte)0);
if (nullPos != -1)
{
    // 截取到空字节之前的部分
    fileBytes = fileBytes.Take(nullPos).ToArray();
}
// 根据实际编码解码,这里假设是UTF-16
string cleanStr = Encoding.Unicode.GetString(fileBytes);

你可以根据自己写入时的实际编码选择对应的方案,优先确认写入时用的是哪种编码,这样能最直接解决问题。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:27:39