打印小票时自动换行算法,可处理各种字符混排
2012-02-20 17:04
555 查看
这是一个算法,是我在做热敏打印机打印小票时解决的一个问题,想了想还是分享给大家,或许多大家有些许帮助。
在打印小票时,可能遇到一些字符串长度过长的问题,但是你不能直接截取,所以需要自动换行来显示全部名称。经过分析,其实是这么一个问题:需要把字符串分行,使得每行不得超过最大长度,最后一行长度为指定的最小长度,长度不够,用空格补齐。
先给出一个简单的效果示例图:
具体的算法源码:
由于该算法是按照字节处理的,所以可以处理中英文、数字及各种字符的混排,当截取的最后一位正好是汉字,则会自动处理到前一个字符,不会出现截取错误而导致乱码。
在打印小票时,可能遇到一些字符串长度过长的问题,但是你不能直接截取,所以需要自动换行来显示全部名称。经过分析,其实是这么一个问题:需要把字符串分行,使得每行不得超过最大长度,最后一行长度为指定的最小长度,长度不够,用空格补齐。
先给出一个简单的效果示例图:
具体的算法源码:
#Region "把字符串按指定最大长度分行,使得最后一行长度为指定的最低长度" ''' <summary> ''' 处理字符串自动换行问题。最短为intLenMin,最长为intLenMax,最后一行用空格补齐到intLenMin长度。 ''' </summary> ''' <param name="strOldText">原字符串</param> ''' <param name="intLenMin">最短字节长度</param> ''' <param name="intLenMax">最长字节长度</param> ''' <returns>string</returns> ''' <remarks></remarks> Public Function AutomaticLine(ByVal strOldText As String, ByVal intLenMin As Integer, ByVal intLenMax As Integer) As String Dim intLength As Integer Dim strResult As String = "" '获取原字符串的字节长度 intLength = System.Text.Encoding.GetEncoding("gb2312").GetByteCount(strOldText) If intLength > intLenMax Then '总字节数> 最长截取的最长字节数, '则截取最长字节数, 然后对剩余字符串再处理 '获取字符串的UCS2码 Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(strOldText) '获取字符的实际截取位置 Dim intCutPos = RealCutPos(bytes, intLenMax) '采用递归调用 strResult = System.Text.Encoding.Unicode.GetString(bytes, 0, intCutPos * 2) + vbCrLf + AutomaticLine(Mid(strOldText, intCutPos + 1), intLenMin, intLenMax) ElseIf intLength > intLenMin Then '如果 最长字节数 >总字节数 > 最短字节数,则 换行,并补齐空格到最短字节数位置 strResult = strOldText + vbCrLf + Space(intLenMin) Else '如果 总字节数 < 最短字节数,则直接补齐空格到最短字节数的位置 strResult = strOldText + Space(intLenMin - intLength) End If Return strResult End Function ''' <summary> ''' 返回字符的实际截取位置 ''' </summary> ''' <param name="bytes">UCS2码</param> ''' <param name="intLength">要截取的字节长度</param> ''' <returns></returns> ''' <remarks></remarks> Public Function RealCutPos(ByVal bytes As Byte(), ByVal intLength As Integer) As Integer '获取UCS2编码 Dim intCountB As Integer = 0 ' 统计当前的字节数 Dim intCutPos As Integer = 0 '记录要截取字节的位置 While (intCutPos < bytes.GetLength(0) AndAlso intCountB < intLength) ' 偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节 If intCutPos Mod 2 = 0 Then ' 在UCS2第一个字节时,字节数加1 intCountB += 1 Else ' 当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节 If bytes(intCutPos) > 0 Then intCountB += 1 End If End If intCutPos += 1 End While ' 如果intCutPos为奇数时,处理成偶数 If intCutPos Mod 2 = 1 Then ' 该UCS2字符是汉字时,去掉这个截一半的汉字 If bytes(intCutPos) > 0 Then intCutPos = intCutPos - 1 Else ' 该UCS2字符是字母或数字,则保留该字符 intCutPos = intCutPos + 1 End If End If Return intCutPos / 2 End Function #End Region
由于该算法是按照字节处理的,所以可以处理中英文、数字及各种字符的混排,当截取的最后一位正好是汉字,则会自动处理到前一个字符,不会出现截取错误而导致乱码。
相关文章推荐
- 打印小票时自动换行算法,可处理各种字符混排
- 打印小票时自动换行算法,可处理各种字符混排
- 根据服务器端返回的字符数组,展示字符串标签,需要涉及字符串长度处理以及字符串换行,字符串不够一行自动跳到第二行的逻辑
- vb 如何在Text文本框或Label里显示一个字符后自动换行
- 在进行文字自绘时,自动换行打印
- 让长字符自动换行 比如URL和Email地址等
- 巨有用的一篇帖子 关于各种算法 海量数据处理
- 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
- HTML select处理文字超出宽度自动换行的问题
- grid行中单元格文本自动处理换行
- B/S下基于LODOP控件客户端自动打印小票
- 英文字符自动换行(防止表格撑坏)方法
- MyEclipse中 将字符串回车自动换行的配置(自己最常用的就是解决在pl/sql工具下美化好的sql语句放入字符串中)
- 合格证打印自动换行问题解决方案
- Html中div和table自动换行(中文和字符)
- vb 如何在Text文本框或Label里显示一个字符后自动换行
- 多行文本编辑时,同一行编辑不同类型的字符时自动换行的问题
- boost::lexical_cast 字符类型转换 字符串算法和文字处理
- 字符超过某一指定长度自动换行
- A* 算法处理游戏自动寻路