C#操作RTF文档

http://tech.ddvip.com   2007年11月20日    社区交流

内容摘要:笔者正在用C#开发一个名为XWriter的文本编辑器,其中需要提供对RTF文档的支持,以前从没有搞过RTF文档,因此临时突击研究了一下,经过几天的学习研究和实践,对C#操作RTF文档有所了解,因此才可以写出此文给予说明,希望能对其他人学习RTF文档格式有所帮助。

  我们使用Windows写字板新建一个RTF文档,只输入"Hellow"文本,设置文本颜色为蓝色,然后保存,然后使用记事本打开刚刚保存的RTF文件,此时就能看到一个最简单的RTF文档的内容了,其内容如下。

  {
   tf1ansiansicpg936deff0deflang1033deflangfe2052
  {fonttbl
  {f0fmodernfprq6fcharset134'cb'ce'cc'e5;}
  }
  {colortbl; ed0green0lue255;}
  {*generatorMsftedit5.41.15.1507;}
  viewkind4uc1pardcf1lang2052f0fs20Hellowcf0par
  }

  此处为了便于阅读,对代码进行了缩进处理,实际上RTF文档中空白字符是会影响到显示结果的,一般实际生成RTF文档时不要添加额外的空白字符。

  这段RTF代码第一行和最后一行是表示根组的花括号,然后是""开头的指令,指令名称全部由英文字母组成,若指令后面跟着若干个数字,则这些数字就是指令的参数。比如" tf1",这个指令名称是"rtf",参数值是"1";而"ansi"指令名称是"ansi",没有参数。

  指令" tf"是每个RTF文档必备的,而且总是第一个指令,因此可以看作RTF文档的文件头标记。若一个RTF文档第一个指令不是"rtf"指令,则可以认为这个RTF文档是不合法的。

  指令"ansicpg"就是说明该RTF文档的内容的编码格式,参数就是编码格式编号,例如"ansicpg936"就是指明编码格式为936号字符集,对于C#程序来说,就是库函数System.Text.Encoding.GetEncoding(936)的返回结果,也就是GB2312编码格式。RTF文档本身肯定是使用标准的ANSI格式保存的,此处指明的字符编码格式是用于处理RTF文档中的转义字符的,比如代码中由连续的转义字符'cb'ce'cc'e5,程序解析RTF文档时,应当将这一串转义字符生成一个字节数组,内容为0xcb,0xce,0xcc,0xe5,然后使用第936号编码格式对象的GetString(byte[])函数来还原所存储的字符串,也就是"宋体"两个字。这点比HTML的转义字符处理要麻烦一些,HTML转义字符是一个指令定义一个字符,而RTF中的是一个指令定义一个字节,而汉字是双字节的字符编码,转化前还得设法获得完整的字节序列。

责编:豆豆技术应用

正在加载评论...