打印文字的编码问题

时间:2023-01-05 16:12:03

当前,开发给香港雀巢的订单系统,打印功能要求比较简单,客户要求不使用第三方控件,所以,自己写打印类来操作。

一切进展良好,打印类支持RichText和普通text文本的打印,添加了一些辅助的,比如自动计算页码并在页头/页尾打印,支持打印页标题和报表标题等.


为了进一步简化程序,扩展打印类的构造函数,使其直接支持DataGrid控件和richtext控件,以及ImgView.
编码使用Encoding.Default,在本地环境(Win2000Pro 简体中文)测试,使用简体中文+繁体中文+英文混合的文字内容,发现richtext支持良好(img的当然不会有问题了,图片嘛),datagrid的就有问题,在UI中显示良好,打印时有汉字的却出现乱码.

如是察看资料,改进.经查找,c#的编码使用unicode,而汉字呢,目前win2000及以上系列的os强制支持GB18030的,但是呢,他们虽然都是双字节表示一个含有字符的,但在自身2个字节的存放和传输顺序上不同,详细如下:

打印文字的编码问题1993年,Unicode 1.1版本推出,收录了*、*、日本及韩国通用字符集的汉字,总共有20,902个。
打印文字的编码问题
打印文字的编码问题*订定了等同于Unicode 1.1版本的“GB 13000.1-93”“信息技术 通用多八位编码字符集(UCS) 第一部分:体系结构与基本多文种平面”。
打印文字的编码问题
打印文字的编码问题由于GB 2312-80只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理*的“镕”字),*及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312-80未有使用的编码空间,收录了所有出现在Unicode 1.1及GB 13000.1-93之中的汉字,制定了GBK编码。
打印文字的编码问题
打印文字的编码问题根据西方资料,GBK最初是由微软对GB2312的扩展,也就是CP936字码表 (Code Page 936)的扩展(原来的CP936和GB 2312-80一模一样),最初出现于Windows 95简体中文版中,由于Windows产品的流行和在大陆广泛被使用,*国家有关部门将其作为技术规范。注意GBK并非国家正式标准,只是国家技术监督局标准化司、电子工业部科技与质量监督司发布的“技术规范指导性文件”。虽然GBK收录了所有Unicode 1.1及GB 13000.1-93之中的汉字,但是编码方式与Unicode 1.1及GB 13000.1-93不同。仅仅是GB 2312到GB 13000.1-93之间的过渡方案。
打印文字的编码问题
打印文字的编码问题
打印文字的编码问题[编辑] 后续
打印文字的编码问题*国家标准总局于2000年推出了GB 18030-2000标准,以取代GBK。GB 18030-2000除了保留了全部GBK编码的汉字外,还增加了大约一百个汉字及四位元组编码空间。请参看GB 18030-2000。
打印文字的编码问题
打印文字的编码问题
参见
打印文字的编码问题http://zh.wikipedia.org/wiki/GBK
打印文字的编码问题
打印文字的编码问题http://www.microsoft.com/globaldev/reference/dbcs/
打印文字的编码问题http://www.microsoft.com/globaldev/reference/dbcs/936/936_CA.mspx


虽然都是UNOICODE方式,但是和通用的unicode的编码在字节存放顺序上不同,所以不要指定BigEndian,而不是直接用Encoding.Unicode。

因此,改正写到printer的stream的编码方式为:

打印文字的编码问题System.Text .Encoding.BigEndianUnicode

再打印,一切正常,再到winXP 简体中文版,win2000pro /xp 繁体中文,和win2000pro英文版测试,打印都正确。

拿到客户测试,在普通打印机上,打印正常(中间出现了文字对齐等问题,经查找原因后发现是字体问题,修正)。再到他们打印发票的地方(系统中有发票打印),是IBM 5400-LA2 高速打印机,打印的怎么都不正确。

搞了好几天,很多尝试更改,都仍然没解决问题,如是怀疑是不是这款打印机有什么特别的地方,一看,打印机的打印模式为DBCS字体(

打印文字的编码问题http://www-8.ibm.com/printers/tw/products/linematrix/5400la2_spec.html

 

打印文字的编码问题IBM 5400-LA2 行列式點陣印表機規格快速一覽表 
打印文字的编码问题類型  5400-LA2 
打印文字的编码问题列印方法 行列點陣方式 
打印文字的编码问题列印速度 (6LPI) 列印模式  DBCS 字體    
打印文字的编码问题Draft  24X24(12 點水平跳躍 )  225 行 / 分鐘  
打印文字的编码问题DP  24X24(8 點水平跳躍 )  205 行 / 分鐘  
打印文字的编码问题NLQ  24X24  150 行 / 分鐘  
打印文字的编码问题High Quality  24X24( 單向 )  75 行 / 分鐘  
打印文字的编码问题NLQ-Level1  24X24( 雙擊 )  150 行 / 分鐘  
打印文字的编码问题NLQ-Level2  24X24( 長擊 )  75 行 / 分鐘  
打印文字的编码问题NLQ-Level3  24X24( 長擊與雙擊 )  75 行 / 分鐘  
打印文字的编码问题CPI  DBCS  系統連接埠 / 乙太網路埠 (Telnet5250E)  5, 6, 6.7, 7.5CPI ( 使用控制碼 )  
打印文字的编码问题平行埠 / 乙太網路埠 (LPR-5577 模式) 5, 6, 6.7, 7.5CPI ( 使用控制碼、操作面板 )  
打印文字的编码问题平行埠 / 乙太網路埠 (LPR-ESC/P-K, ESC/P-C, KS/KSSM 模式 )  5, 6, 6.7CPI ( 使用控制碼、操作面板 )  
打印文字的编码问题SBCS  系統連接埠 / 乙太網路埠 (Telnet5250E)  10, 12, 13.3, 15, 18 CPI ( 使用控制碼 )  
打印文字的编码问题平行埠 / 乙太網路埠 (LPR-5577 模式)  10, 12, 13.3, 15 CPI ( 使用控制碼、操作面板 )  
打印文字的编码问题平行埠 / 乙太網路埠 (LPR-ESC/P-K, ESC/P-C, KS/KSSM 模式 )  10, 12, 15, 17.1, 20 CPI, Proportional ( 使用控制碼、操作面板 )  
打印文字的编码问题LPI  系統連接埠 / 乙太網路埠 (Telnet 5250E)  4, 6, 7.5, 8 LPI ( 使用控制碼 ) 
打印文字的编码问题平行埠 / 乙太網路埠 (LPR)  2, 3, 4, 5, 6, 7.5, 8 LPI ( 使用控制碼、操作面板 )  
打印文字的编码问题最大列印區域  系統連接埠 / 乙太網路埠 (Telnet 5250E)  4, 6, 7.5, 8 LPI ( 使用控制碼 ) 
打印文字的编码问题平行埠 / 乙太網路埠 (LPR)  2, 3, 4, 5, 6, 7.5, 8 LPI ( 使用控制碼、操作面板 )  
打印文字的编码问题

)。DBCS字体? 什么东西啊?查找资料,终于明白了

 

打印文字的编码问题ASCII 的一個字元,相當於一個位元組的大小,從 0 到 255 共可容納 256 種
打印文字的编码问题
打印文字的编码问题字元,對那些螃蟹字母的國家來說,已經足夠了。但對一些使用了象形文字為
打印文字的编码问题
打印文字的编码问题基礎的國家,像是中日韓等國家來說,自然是不敷使用。於是 DBCS 系統就應
打印文字的编码问题
打印文字的编码问题運而生了。
打印文字的编码问题
打印文字的编码问题DBCS 是雙位元組字元系統 ( Double Byte Char Systems ) 的縮寫,DBCS 保
打印文字的编码问题
打印文字的编码问题留了標準 ANSI 字元,但將擴充 ANSI 字元挪做己用。不要被 DBCS 的名稱給
打印文字的编码问题
打印文字的编码问题騙了,它在標準 ANSI 字元是使用一個位元組,祇有當地文字才使用兩個位元
打印文字的编码问题
打印文字的编码问题組。以中文來說,Big5 的編碼方式就是 DBCS 的編碼方式。
打印文字的编码问题
打印文字的编码问题
打印文字的编码问题而UNICODE是世界性的字符集,几乎包含了世界上的所有字符,每个字符都有一
打印文字的编码问题
打印文字的编码问题个单一的UNICODE值。UNICODE值也是占用两个字节的。但不同的是它虽然也包
打印文字的编码问题
打印文字的编码问题含了标准的ANSI字符值,但是ANSI字符只占用一个字节,UNICODE会自动在ANSI
打印文字的编码问题
打印文字的编码问题值后加入一个值为0的字节。比如说一个ANSI值为
&h45 的字符,以UNICODE形式
打印文字的编码问题
打印文字的编码问题存放则为"45 00"。但是普通的非ANSI字符以UNICODE形式时则是从右存到左的
打印文字的编码问题
打印文字的编码问题。比如一个值为
&H1234 的字符,存为UNICODE时则为"34 12" 


 

而且:

打印文字的编码问题ASCII是DOS时代的,无法支持中文。DBCS是Win9x支持的字符集。UNICODE是win2k和xp支持的字符集。
打印文字的编码问题而汉字的编码目前有GB2312-1980和GB18030-2000,GB2312就是DBCS类型的汉字编码,GB18030就是UNICODE的汉字编码,当然GB18030兼容GB2312,也就是说GB18030也支持DBCS的字符处理方式。虽然GB18030是2000年后强制执行的国家标准,但目前使用最多的还是GB2312编码,而且GB2312也足够处理你所用到的汉字了。还有GBK编码是GB2312的增强版。
打印文字的编码问题
终于发现问题所在了。但是解决问题好像就比较困难了,只有自己编写解析的方法把unicode提取,再编码成DBCS方式,再送到打印机~~~~~~