文档章节

打印小票时自动换行算法,可处理各种字符混排

白志华
 白志华
发布于 2015/10/18 10:56
字数 841
阅读 40
收藏 0
点赞 0
评论 0

       这是一个算法,是我在做热敏打印机打印小票时解决的一个问题,想了想还是分享给大家,或许多大家有些许帮助。

       在打印小票时,可能遇到一些字符串长度过长的问题,但是你不能直接截取,所以需要自动换行来显示全部名称。经过分析,其实是这么一个问题:需要把字符串分行,使得每行不得超过最大长度,最后一行长度为指定的最小长度,长度不够,用空格补齐。

先给出一个简单的效果示例图:

具体的算法源码:

#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

 

       由于该算法是按照字节处理的,所以可以处理中英文、数字及各种字符的混排,当截取的最后一位正好是汉字,则会自动处理到前一个字符,不会出现截取错误而导致乱码。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
白志华
粉丝 29
博文 260
码字总数 57524
作品 0
长沙
程序员
zz304222428/DriverPosPrint

驱动打印小票--80热敏打印机 项目环境基于JFinal2.2 偷了个懒直接在JFinal demo上做的 在大神 SubLuLu/thermalprinter 开源的项目基础上写了这个demo,SubLuLu用的是指令打印,而且环境是基于...

zz304222428 ⋅ 2016/10/11 ⋅ 0

第1章 标准输入流 & 转换流 & 打印流

1.1 标准输入输出流 public static final InputStream in:标准输入流 public static final PrintStream out:标准输出流 1.2 转换流 1.2.1 OutputStreamWriter:将字节输出流转换为字符输出流 ...

我是小谷粒 ⋅ 04/17 ⋅ 0

关于Base⑥4编码换行回车引发的blood事件

分析某个sdk的通讯协议,万变不离其宗,基本都是对称加密或者非对称加密后圌进行通讯完整性以及内容可靠性的反复校验。 周三稍微逆向差不多看了实现,偷懒没继续,周四下午任务交接发现以为不...

kingsOSZT ⋅ 2016/05/17 ⋅ 0

iphone聊天用几种图形(表情)与文字混排的实现与比较 [复制链接]

一、用HTML实现文字表情混合排列 用HTML实现图形文字混排的好处就是你不需要考虑表情在文字里面的位置问题,你只需要自己做一个HTML,然后用UIWEBVIEW加载一下,然后再把WENVIEW放到视图上,...

长平狐 ⋅ 2012/08/13 ⋅ 0

商铺记账系统软件--bluebee蓝蜜蜂记账系统

此项目已废弃:) Donate捐助 bluebee accounting system is a popular and free accounting system for individual businesses.This system focus on the individual businesses operation......

刘学炜 ⋅ 2013/04/18 ⋅ 10

linux的echo命令简单介绍

介绍: linux的echo命令, 在终端下打印变量value的时候也是常常用到, echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。 详细: 语法: echo [ -n ] 字符串 。 其中选项n...

FrendLin ⋅ 2016/07/07 ⋅ 0

【Java基础】 PrintWriter和BufferedWriter的区别

最近研究Java Socket编程,经常要对字节输出流和字符输出流打交道,所以在这梳理PrintWriter和BufferedWriter的用法和区别 BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字...

林元煌 ⋅ 2017/07/07 ⋅ 0

Linux下echo的用法

linux下echo命令详解 Echo 默认显示内容到屏幕上, 例子: echo “i am study linux .” >> oldboy.txt 意思是将”i am study linux.” 放入oldboy.txt中.其中>>是追加的意思.将双引号内部的内...

高蛋白小虫 ⋅ 2017/05/04 ⋅ 0

Linux下echo的用法

linux下echo命令详解 Echo 默认显示内容到屏幕上, 例子: echo “i am study linux .” >> oldboy.txt 意思是将”i am study linux.” 放入oldboy.txt中.其中>>是追加的意思.将双引号内部的内...

高蛋白小虫 ⋅ 2017/05/04 ⋅ 0

桌面数据库绿色版

桌面数据库是一个高效的数据库管理与制表平台,功能强劲,适用范围广,各行业均可使用。1、自由创建、修改、管理、操作表:有详细的使用介绍,生手亦可很快入门。数据库管理,是本软件的主要...

相心的泪 ⋅ 2016/08/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部