You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取和写入PostScript文件的正确编码及避免数据丢失的方法

解决PostScript文件原样读写无数据丢失的问题

问题根源

PostScript文件可能包含ASCII范围外的二进制字节数据,用StreamReader/StreamWriter按UTF-8编码读写时,会尝试将字节解析为UTF-8字符,对不符合UTF-8规则的字节进行错误替换或新增,导致原始数据损坏。

解决方案

方案1:直接操作字节流(推荐,精确控制)

跳过编码转换,直接以字节形式读写文件,完整保留所有原始数据:

// 读取原始文件所有字节
byte[] originalBytes = File.ReadAllBytes("filename.ps");

// 定义要插入的PostScript命令,转换为ASCII字节(PS命令通常为ASCII格式)
string psCommand = "你的PostScript命令内容";
byte[] commandBytes = Encoding.ASCII.GetBytes(psCommand + Environment.NewLine);

// 确定插入位置的字节偏移量(需提前解析PS内容,找到目标行对应的字节位置)
int insertByteOffset = 1000; // 示例偏移量,需根据实际情况计算

// 拼接新的字节数组
List<byte> newFileBytes = new List<byte>();
newFileBytes.AddRange(originalBytes.Take(insertByteOffset));
newFileBytes.AddRange(commandBytes);
newFileBytes.AddRange(originalBytes.Skip(insertByteOffset));

// 写入新文件
File.WriteAllBytes("updatedfilename.ps", newFileBytes.ToArray());

方案2:用Latin1编码逐行处理

如果需要按行解析并插入命令,使用ISO-8859-1(Latin1)编码,它会将每个字节直接映射为对应字符,无编码丢失:

Encoding latin1 = Encoding.GetEncoding("ISO-8859-1");
int targetLine = 50; // 要插入命令的目标行号

using (StreamReader sr = new StreamReader("filename.ps", latin1, true))
using (StreamWriter sw = new StreamWriter("updatedfilename.ps", false, latin1))
{
    string line;
    int currentLine = 0;
    while ((line = sr.ReadLine()) != null)
    {
        currentLine++;
        // 在目标行前/后插入命令,这里示例为目标行前插入
        if (currentLine == targetLine)
        {
            sw.WriteLine("你的PostScript命令");
        }
        // 写入原始行内容
        sw.WriteLine(line);
    }
}

关键说明

  • Latin1编码的核心特性是1字节对应1字符,覆盖0-255所有字节值,不会对原始字节做任何修改或替换,完美适配PostScript文件的字节结构。
  • UTF-8编码仅支持特定格式的字节序列,非UTF-8字节会被替换为�或其他无效字符,导致PS文件损坏。

内容的提问来源于stack exchange,提问作者pradeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:50:24