当前,开发给香港雀巢的订单系统,打印功能要求比较简单,客户要求不使用第三方控件,所以,自己写打印类来操作。
一切进展良好,打印类支持RichText和普通text文本的打印,添加了一些辅助的,比如自动计算页码并在页头/页尾打印,支持打印页标题和报表标题等.
为了进一步简化程序,扩展打印类的构造函数,使其直接支持DataGrid控件和richtext控件,以及ImgView.
编码使用Encoding.Default,在本地环境(Win2000Pro 简体中文)测试,使用简体中文+繁体中文+英文混合的文字内容,发现richtext支持良好(img的当然不会有问题了,图片嘛),datagrid的就有问题,在UI中显示良好,打印时有汉字的却出现乱码.
如是察看资料,改进.经查找,c#的编码使用unicode,而汉字呢,目前win2000及以上系列的os强制支持GB18030的,但是呢,他们虽然都是双字节表示一个含有字符的,但在自身2个字节的存放和传输顺序上不同,详细如下:
1993年,Unicode 1.1版本推出,收录了中国大陆、台湾、日本及韩国通用字符集的汉字,总共有20,902个。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
中国大陆订定了等同于Unicode 1.1版本的“GB 13000.1-93”“信息技术 通用多八位编码字符集(UCS) 第一部分:体系结构与*本多文种平面”。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
由于GB 2312-80只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理***的“*”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312-80未有使用的编码空间,收录了所有出现在Unicode 1.1及GB 13000.1-93之中的汉字,制定了GBK编码。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
根据西方资料,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之间的过渡方案。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[编辑] 后续
中华人民共和国国家标准总局于2000年推出了GB 18030-2000标准,以取代GBK。GB 18030-2000除了保留了全部GBK编码的汉字外,还增加了大约一百个汉字及四位元组编码空间。请参看GB 18030-2000。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
参见
|
虽然都是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 ( 使用控制碼、操作面板 )
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
)。DBCS字体? 什么东西啊?查找资料,终于明白了
ASCII 的一個字元,相當於一個位元組的大小,從 0 到 255 共可容納 256 種
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
字元,對那些螃蟹字母的國家來說,已經足夠了。但對一些使用了象形文字為
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
*礎的國家,像是中日韓等國家來說,自然是不敷使用。於是 DBCS 系統就應
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
運而生了。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
DBCS 是雙位元組字元系統 ( Double Byte Char Systems ) 的縮寫,DBCS 保
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
留了標準 ANSI 字元,但將擴充 ANSI 字元挪做己用。不要被 DBCS 的名稱給
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
騙了,它在標準 ANSI 字元是使用一個位元組,祇有當地文字才使用兩個位元
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
組。以中文來說,Big5 的編碼方式就是 DBCS 的編碼方式。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
而UNICODE是世界性的字符集,几乎包含了世界上的所有字符,每个字符都有一
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
个单一的UNICODE值。UNICODE值也是占用两个字节的。但不同的是它虽然也包
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
含了标准的ANSI字符值,但是ANSI字符只占用一个字节,UNICODE会自动在ANSI
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
值后加入一个值为0的字节。比如说一个ANSI值为&h45的字符,以UNICODE形式
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
存放则为"45 00"。但是普通的非ANSI字符以UNICODE形式时则是从右存到左的
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
。比如一个值为&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的增强版。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
终于发现问题所在了。但是解决问题好像就比较困难了,只有自己编写解析的方法把unicode提取,再编码成DBCS方式,再送到打印机~~~~~~