如何从SQL Server正确提取Win-1252编码文件内容并还原?
问题分析与解决方案
核心问题
你的.NET Core代码执行了多余且错误的编码转换,导致原始文件内容被破坏。
遗留代码的实际流程
- 读取文件的Win-1252字节数组
- 通过Win-1252编码将字节数组解码为.NET字符串(内部以UTF-16格式存储)
- 将该字符串存入SQL Server的
text列(SQL Server会以UTF-16格式保存这个字符串)
你的错误转换逻辑
你错误地将从数据库取出的UTF-16字符串先编码为Win-1252字节,再解码为UTF8字符串,最后又编码为UTF8字节写入文件——这相当于对原始内容做了两次错误的编码转换,完全偏离了原始字节流。
正确代码实现
直接将从数据库获取的字符串用Win-1252编码回字节数组,然后写入文件即可:
var content = _dBContext.Docs.Where(e => e.Id == id).Select(e => e.Contents).SingleOrDefault(); if (content == null) return; // 处理空内容场景 byte[] originalWin1252Bytes = Encoding.GetEncoding(1252).GetBytes(content); File.WriteAllBytes(filename, originalWin1252Bytes);
原理说明
- 从数据库取出的
content是遗留应用用Win-1252解码得到的.NET字符串,内部存储为UTF-16格式 - 用Win-1252编码该字符串,就能还原出遗留应用读取文件时的原始Win-1252字节数组
- 将这个字节数组直接写入文件,即可得到与原始文件完全一致的内容
验证建议
可以对比原始文件和生成文件的字节哈希值(如MD5或SHA256),确认两者完全一致,以此验证结果正确性。
内容的提问来源于stack exchange,提问作者T M
相关产品推荐
相关产品推荐

