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
相关产品推荐
相关产品推荐

