C#中实现IBM870转CP1250编码遇阻,求解决方案
解决IBM870到CP1250编码转换问题
首先,.NET 默认不包含 IBM870 这类小众编码的支持,你安装的 System.Text.Encoding 是基础库,需要额外安装扩展包来获取这些编码的定义:
安装正确的NuGet包
卸载现有无关的包,安装System.Text.Encoding.CodePages,这个包提供了各类小众编码的实现。注册编码提供器
在获取编码实例前,必须先注册编码提供器,否则Encoding.GetEncoding(870)会抛出异常。修正分块读取逻辑
你的代码只读取了50字节,实际需要循环读取整个文件,同时因为IBM870和CP1250都是单字节编码,分块转换不会出现字符截断问题,可以放心处理。
以下是修正后的完整代码:
using System.Text; // 注册编码提供器,必须放在获取编码实例之前 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding eIBM870 = Encoding.GetEncoding(870); Encoding eCP1250 = Encoding.GetEncoding(1250); // 读取整个文件并转换 using (FileStream fInput = File.OpenRead(fileInput.Text)) using (FileStream fOutput = File.OpenWrite("output_cp1250.txt")) using (StreamWriter writer = new StreamWriter(fOutput, eCP1250)) { byte[] buffer = new byte[4096]; // 用4096字节作为分块大小,效率更高 int bytesRead; while ((bytesRead = fInput.Read(buffer, 0, buffer.Length)) > 0) { // 转换编码 byte[] convertedBytes = Encoding.Convert(eIBM870, eCP1250, buffer, 0, bytesRead); // 直接写入转换后的字节,或者转成字符串写入 writer.Write(eCP1250.GetString(convertedBytes)); } }
关键说明
CodePagesEncodingProvider.Instance是扩展包提供的编码提供器,注册后才能通过代码页号获取IBM870、CP1250这类编码。- 使用
using语句自动释放文件流资源,避免内存泄漏。 - 选择合适的分块大小(比如4096)比固定50字节更高效,适合处理大文件。
- 如果IBM870文件中有CP1250不支持的字符,转换时会自动替换为默认的替代字符(通常是
?),如果需要自定义替代逻辑,可以使用EncoderFallback和DecoderFallback。
内容的提问来源于stack exchange,提问作者Kris jr
相关产品推荐
相关产品推荐

