文件分割乱码总结(大小文件、中文乱码)
用程序实现文件分割很容易出现乱码,尤其是中文,因为每个汉字由两个字节组成,分割时很容易把这两个字节分开。被分开的前一字节无法再组成汉字,后一字节与仅跟其后的汉字的前一字节组成一个汉字,如果组合正确形成一个正确的汉字,否则形成根本不存在的汉字,依次往后组合会形成一系列乱码。
分割小文件可以一次读取,直接在读取时加 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 是奇数还是偶数可以判断是否截断了最后一个汉字的字节。