.NET Core默认不支持GB2312的问题 Encoding.Default.GetString 乱码问题

博客指出.NET Core默认不支持GB2312,使用Encoding.GetEncoding(“GB2312”)会抛异常。给出解决方案,即手动安装System.Text.Encoding.CodePages包,通过PM命令行操作,再在程序启动时加入Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),之后就能正常使用相关编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.NET Core默认不支持GB2312,使用Encoding.GetEncoding(“GB2312”)的时候会抛出异常。

 

解决方案是手动安装System.Text.Encoding.CodePages包

PM命令行:Install-Package System.Text.Encoding.CodePages

然后在程序启动加入

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

,接着就可以正常使用Encoding.GetEncoding(“GB2312”)了。

 

 Encoding.Default.GetString(cnt)

### 压缩文件乱码问题的原因与解决方案 压缩文件中的乱码问题是由于不同的操作系统或工具使用的字符编码不一致所引起的。具体来说: #### 1. 编码差异分析 Windows 和 Linux 的默认编码格式存在显著区别,这通常是导致乱码的根本原因。在 Windows 下,默认的编码格式通常为 GBK 或其他本地化编码;而在 Linux 中,默认采用的是 UTF-8 编码[^3]。 当在一个平台上创建的压缩文件被另一个平台解压时,如果没有正确处理编码转换,则可能导致文件名或其他元数据(如注释)显示为乱码。 #### 2. Java 环境下的解决方法 对于基于 Java 的开发环境,可以通过显式指定编码来避免乱码现象。例如,在使用 `ZipOutputStream` 类时,可以调用其 `setEncoding()` 方法并传入目标编码参数(如 `"GBK"`)。以下是具体的实现代码示例: ```java import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipExample { public static void main(String[] args) throws Exception { try (var zos = new ZipOutputStream(new java.io.FileOutputStream("example.zip"))) { // 设置编码为 GBK 避免中文乱码 zos.setEncoding("GBK"); var entry = new ZipEntry("中文测试.txt"); zos.putNextEntry(entry); zos.write("这是一个测试".getBytes()); zos.closeEntry(); // 添加注释同样需要注意编码一致性 zos.setComment("这是注释 - 中文测试"); } } } ``` 上述代码片段展示了如何通过设置正确的编码来防止压缩过程中产生的乱码问题[^1]。 #### 3. C# 开发环境下应对策略 针对 .NET 平台上的应用,特别是涉及第三方库的情况,也可以采取类似的措施。比如利用 ICSharpCode.SharpZipLib 库时,需引入支持多字节集的功能模块,并手动配置相应的编码规则。下面给出一段示范性的源程序清单: ```csharp using System.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; class Program { static void Main() { using(var fs = File.Create("archive.zip")) { using(var zipStream = new ZipOutputStream(fs)) { zipStream.SetLevel(9); // Compression level byte[] buffer; string fileNameInZip = "中文目录/中文文件.txt"; var entryNameBytes = Encoding.GetEncoding("GB2312").GetBytes(fileNameInZip); var entryName = System.Text.Encoding.Default.GetString(entryNameBytes); var entry = new ZipEntry(entryName){ DateTime = DateTime.Now, Size = new FileInfo(@"sourceFile.txt").Length }; zipStream.PutNextEntry(entry); using(FileStream fileReader = File.OpenRead(@"sourceFile.txt")){ int size = 4096; buffer = new byte[size]; while(true){ size = fileReader.Read(buffer, 0 ,buffer.Length); if(size > 0){ zipStream.Write(buffer, 0, size); }else{ break; } } } zipStream.CloseEntry(); } } } } ``` 此脚本说明了怎样借助 SharpZipLib 实现跨平台兼容的同时保留原始路径名称中的汉字信息[^2]。 #### 4. 总结建议 无论是哪种编程语言或者框架结构,核心思路都是统一操作系统的文本表示形式到同一个标准上——即要么全部切换成 UTF-8 ,要么都维持原有的区域特定设定像 GBK 。只要两端保持同步即可有效规避此类错误的发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xcagy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值