在平时打开CSV文件或者将CSV文件导入数据库的时候,经常遇到文档中的中文显示乱码,主要问题就是编码出现了问题。
在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码,有的CSV文件从网页上导出时默认是ANSI编码,而系统默认打开是UTF8编码,导致打开后中文出现乱码。
遇到这种问题我们不要慌,最简单的方法是将CSV文件用TXT打开,然后另存为,在保存按钮的左侧可以修改CSV文件的编码方式,修改后再用Excel打开CSV,中文就恢复正常了。
但遇到多个文件或文件过大时,就不适合这样一个一个修改了。
经多次摸索,我搞定了C#程序自动转换编码的小程序,可以一次自动转换多个CSV文件或TXT文件的编码,程序界面如下:
具体的程序我已经上传到我的CSDN里边了,大家有需要或感兴趣可以下载来使用。打开链接
下面是部分代码,大家可以参考
private void Button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new()
{
//该值确定是否可以选择多个文件
Multiselect = true,
//对话框标题
Title = "请选择一个或多个txt或csv文件",
//打开文件的类型
Filter = "Files|*.txt;*.csv"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
int i = 0;
try
{
foreach (string s in dialog.FileNames)
{
string last = s.Substring(s.Length - 3, 3);
//获取保存路径
string? path = System.IO.Path.GetDirectoryName(s);
//获取原文件名称
string? filename = System.IO.Path.GetFileNameWithoutExtension(s);
string outputFile = path + "/" + filename + "ANSI." + last;
// 打开CSV文件流
using (StreamReader reader = new(s, Encoding.Default))
{
// 创建新的CSV文件流并指定编码为ANSI
using StreamWriter writer = new(outputFile, false, Encoding.GetEncoding("GBK"));
// 逐行读取CSV文件内容并写入新的CSV文件
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line);
}
}
i++;
}
MessageBox.Show("转换成功,共转换" + i + "个文件!\r转换后的文件保存在原目录,文件名后加ANSI");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "转换失败");
}
}
}
private void Button2_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new()
{
//该值确定是否可以选择多个文件
Multiselect = true,
//对话框标题
Title = "请选择一个或多个txt或csv文件",
//打开文件的类型
Filter = "Files|*.txt;*.csv"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
int i = 0;
try
{
foreach (string s in dialog.FileNames)
{
string last = s.Substring(s.Length - 3, 3);
//获取保存路径
string? path = System.IO.Path.GetDirectoryName(s);
//获取原文件名称
string? filename = System.IO.Path.GetFileNameWithoutExtension(s);
string outputFile = path + "/" + filename + "UTF8." + last;
// 打开CSV文件流
using (StreamReader reader = new(s, Encoding.GetEncoding("GBK")))
{
// 创建新的CSV文件流并指定编码为ANSI
using StreamWriter writer = new(outputFile, false, Encoding.Default);
// 逐行读取CSV文件内容并写入新的CSV文件
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line);
}
}
i++;
}
MessageBox.Show("转换成功,共转换" + i + "个文件!\r转换后的文件保存在原目录,文件名后加UTF8");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "转换失败");
}
}
}