RichTextBox扩展控件的中文乱码解决方案

简介:

在程序中有利用RichTextBox进行一些操作的需求,无意中在CodeProject中发现了一个封装比较完整的RichTextBox控件(http://www.codeproject.com/KB/edit/csexrichtextbox.aspx),控件封装的还是不错,测试界面效果如下:

 

总体来说,支持各种格式的定义以及图片的插入,效果还是相当不错,不过在实际中使用发现,用代码插入的中文内容会出现乱码。

解决方法一: 

由于本身对RichTextBox的应用以及RTF格式不是很熟悉,搜索很久不得要领,没有找到好的解决方案,后来发现有一个比较取巧的方法,就是重新利用RichTextBox的机制来生成RTF文档内容,然后传入RTF格式内容给控件实现,代码如下所示:

            RichTextBox rtb  =   new  RichTextBox();
            rtb.Font 
=  _font;
            rtb.Text 
=  _text;
            AppendRtf(rtb.Rtf);

 上面部分代码用来替换

 public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor, RtfColor _backColor) 

 函数部分的this.SelectedRtf = _rtf.ToString(); 即可。

 修改后完整的函数代码如下所示:

         public   void  InsertTextAsRtf( string  _text, Font _font, RtfColor _textColor, RtfColor _backColor) {
            StringBuilder _rtf 
=   new  StringBuilder();
            
//  Append the RTF header
            _rtf.Append(RTF_HEADER);

            
//  Create the font table from the font passed in and append it to the
            
//  RTF string
            _rtf.Append(GetFontTable(_font));

            
//  Create the color table from the colors passed in and append it to the
            
//  RTF string
            _rtf.Append(GetColorTable(_textColor, _backColor));

            
//  Create the document area from the text to be added as RTF and append
            
//  it to the RTF string.
            _rtf.Append(GetDocumentArea(_text, _font));

            
// this.SelectedRtf = _rtf.ToString();

            RichTextBox rtb 
=   new  RichTextBox();
            rtb.Font 
=  _font;
            rtb.Text 
=  _text;
            AppendRtf(rtb.Rtf);
        }

 步骤二:

上面那种方法应该是一种取巧的方法,后来学习了几篇文章关于RichTextBox格式介绍,发现还可以通过修改里面的一些编码格式实现中文的处理效果的。

 RichTextBox格式相关的介绍文章如下所示:

 RTF文件格式研究报告(http://www.cnpopsoft.com/article.asp?id=11)

关于RTF(富文本格式)的使用(http://blog.sina.com.cn/s/blog_5d2a73550100bcth.html)

使用C# 编程对RTF 文档进行操作(http://www.webjx.com/htmldata/2007-10-22/1193038864.html)

使用RichTextBox的一点心得(http://blog.csdn.net/jiangxinyu/archive/2008/06/16/2552150.aspx)

看了以上文章,你会发现,文章介绍的ExRichTextBox控件的编码头部内容以及字体内容是设置成了支持英语(美国)以及ASCII码,所以中文无法显示正常导致的乱码,如果修改了RichTextBox的编码头部内容和字体内容,应该就没有问题了。原来的RichTextBox头部内容如下:

         /* RTF HEADER

         * ----------
         * 
         * \rtf[N]        - For text to be considered to be RTF, it must be enclosed in this tag.
         *                  rtf1 is used because the RichTextBox conforms to RTF Specification
         *                  version 1.
         * \ansi        - The character set.
         * \ansicpg[N]    - Specifies that unicode characters might be embedded. ansicpg1252
         *                  is the default used by Windows.
         * \deff[N]        - The default font. \deff0 means the default font is the first font
         *                  found.
         * \deflang[N]    - The default language. \deflang1033 specifies US English.
         * 
*/
        
private   const   string  RTF_HEADER  =   @" {\rtf1\ansi\ansicpg1252\deff0\deflang1033 " ;

如果修改下即可支持中文:

 private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052";

因为介绍内容如下:

1、文件基本属性:

{\rtf1 RTF版本\ansi字符集\ansicpg936简体中文\deff0默认字体0\deflang1033美国英语\deflangfe2052中国汉语

同样,把字体部分稍微调整下:

//  \fcharset specifies the character set of a font in the font table.
            
//  0 is for ANSI.
            _fontTable.Append( @" \fcharset0  " );

修改后变为以下代码即可:

             //  \fcharset specifies the character set of a font in the font table.
            
//  0 is for ANSI.
            
// _fontTable.Append(@"\fcharset0 ");
            _fontTable.Append( @" \fcharset134  " );

调整后测试效果如下图所示,同样可以实现和步骤一的效果:

 

内容打印

在以上基础上,我从别处获取了关于RichTextBox控件的打印功能代码,对该控件进行了功能扩充。打印效果如下图所示:

 

 整合后的控件源码地址:http://files.cnblogs.com/wuhuacong/ExRichTextBox.rar

本文转自博客园伍华聪的博客,原文链接:RichTextBox扩展控件的中文乱码解决方案,如需转载请自行联系原博主。



目录
相关文章
|
SQL 监控 AliSQL
RDS MySQL最新发布的经济规格,包月仅需18元
RDS基础版经济规格,高性价比,让开发更轻松,学习更高效
1781 15
|
Ubuntu Linux KVM
分享一些OpenStack的qcow2格式实例镜像
分享一些OpenStack的qcow2格式实例镜像
13054 0
分享一些OpenStack的qcow2格式实例镜像
|
9月前
|
弹性计算 关系型数据库 数据库
自建数据库迁移到云数据库实操
本课程详细介绍了自建数据库迁移到阿里云RDS的实操步骤。主要内容包括:创建实例资源、安全设置、配置自建的MySQL数据库、数据库的迁移、从自建数据库切换到RDS以及清理资源。通过这些步骤,学员可以掌握如何将自建数据库安全、高效地迁移到云端,并确保应用的正常运行。
435 26
|
机器学习/深度学习 人工智能 自然语言处理
AIGC是什么?对艺术设计学、视觉传达设计、数字媒体艺术等专业的影响
AIGC,人工智能生成内容,融合AI与内容创作,使用GAN、CLIP等技术自动生成图像、文本等,影响艺术设计、视觉传达、数字媒体领域。它提升创作效率,增加多样性,促进创新,改变教育方式,并与Adobe国际认证结合,为设计师提供竞争优势,引领行业变革。
|
10月前
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
298 2
|
10月前
|
人工智能 JavaScript 前端开发
利用 AI 进行代码生成:GitHub Copilot 的实践与反思
【10月更文挑战第23天】本文探讨了GitHub Copilot,一个由微软和OpenAI合作推出的AI代码生成工具,其核心功能包括智能代码补全、多语言支持、上下文感知和持续学习。文章介绍了Copilot在加速开发流程、学习新语言、提高代码质量和减少重复工作等方面的应用,并反思了AI在代码生成中的代码所有权、安全性和技能发展等问题。最后,文章提供了实施Copilot的最佳实践,强调了在使用AI工具时保持对代码的控制和理解的重要性。
|
11月前
|
NoSQL PHP Redis
SSRF一篇文章实战举例全面学懂
SSRF一篇文章实战举例全面学懂
113 0
|
机器学习/深度学习 自然语言处理 TensorFlow
使用Python实现深度学习模型:文本生成与自然语言处理
【7月更文挑战第14天】 使用Python实现深度学习模型:文本生成与自然语言处理
476 12
CI/CD笔记.Gitlab系列:设置GitLab导入源
CI/CD笔记.Gitlab系列:设置GitLab导入源
539 2
|
Java 编译器 开发者
Java注解(Annotation)技术深入解析
Java注解(Annotation)技术深入解析
571 1