程序开发 > C# > 正文

文件分割乱码总结(大小文件、中文乱码)

亮术网 2014-08-20 本网原创

  用程序实现文件分割很容易出现乱码,尤其是中文,因为每个汉字由两个字节组成,分割时很容易把这两个字节分开。被分开的前一字节无法再组成汉字,后一字节与仅跟其后的汉字的前一字节组成一个汉字,如果组合正确形成一个正确的汉字,否则形成根本不存在的汉字,依次往后组合会形成一系列乱码。

  分割小文件可以一次读取,直接在读取时加 GB2312 就可以防止出现中文乱码;分割大文件无法一次读取,需要分段读取,读取的通常是二进制编码,很容易把一个汉字的两个字节截断,从而导致乱码出现。对于后一种情况,如何避免出现中文乱码?这就需要每读取一段内容后判断是否把一个汉字的两个字节分开,判断方法在下文章介绍。

 

  一、小文件分割避免出现中文乱码(C#为例)

  对于可以一次读取的小文件,只要在读取时加 GB2312,就不会出现乱码,实现代码如下:

  using System.IO;

  /// <summary>
  /// 小文件分割避免出现乱码
  /// </summary>
  /// <param name="filePath">文件绝对路径</param>

  public void SplitFile(string filePath)
  {
    //读取时加 GB2312 防止中文乱码
    StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("GB2312"));
    string lines = sr.ReadToEnd();

    string[] arr = lines.Split('\n');
    for (int i = 0; i < arr.Length; i++)
      Response.Write("<br />" + arr[i]);
    sr.Close();
  }

  调用:SplitFile(@"G:\xq\test\books.txt");

 

 

  二、大文件分割避免出现中文乱码

  汉字每个字节的二进制编码最高位(第7位)都是 1,而其它字符最高位不是 1,可据此判断分段读取的内容是否把一个汉字的字节截断。判断方法如下:

  用一个 for 循环从后面开始检查最高位是否为 1,定义一个变量 n,用于记录最高位连续为 1 的次数,当最高位不为 1 了,根据 n 是奇数还是偶数可以判断是否截断了最后一个汉字的字节。

本文浓缩标签:分割乱码文件