文本内容中有全角汉字和半角字符,标签打印机打印程序打印结果或者单片机设备工业屏幕显示结果的宽度不同, 内容需要按照屏幕显示结果的文本长度或者打印出来的内容长度进行分行排版布局。
本程序提供一种通过汉字内码编码规则区分全角汉字和半角字符,根据全角半角来进行分行排版布局的方法。
可以通过C语言移植到单片机设备上,算法原理相同,有C语言移植需求的私信本人
package com.xinhui.test;
import java.util.ArrayList;
import java.util.List;
/**
* 一种根据全角半角计算文本内容长度进行拆分分行排版的算法
* @author ChenChaogui
* @Date 2023年5月26日 下午2:13:36
*
*/
public class TestLineSplit {
/**
* 将文本内容按照指定汉字宽度进行分行
*
* @param content 要拆分的内容
* @param clen 指定一行多少个汉字长度
* @return 拆分过后的多行文本内容
*
*/
public static List<String> lineSplit(String content, int clen){
List<String> lines = new ArrayList<String>();
try {
int word_count = 0, bit_count = 0, single = 0;
int start=0, end=0;
//获取内容的GB2312编码字节流
byte[] btgb = content.getBytes("GB2312");
for (int i=0; i<btgb.length; i++) {
end++;
if((btgb[i] & 0x80) == 0){//0b10000000=0x80
//0开头的半角字符,一个字节一个字
word_count++;
//记录半角字符个数
single++;
bit_count = 0;
}else{
//1开头的中文两个字节一个字
bit_count++;
if(bit_count==2){
bit_count = 0;
word_count++;
}
}
//在显示时两个半角字符和一个全角汉字的占位宽度一样
if(word_count-single/2==clen){
single=0;
word_count=0;
lines.add(new String(byteCopy(btgb, start, end), "GB2312"));
start = end;
}else if(i==btgb.length-1){
//最后剩下的为一行
lines.add(new String(byteCopy(btgb, start, end), "GB2312"));
start = end;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return lines;
}
/**
* 从原字节数组拷贝指定范围的字节到新数组
*
* @param srcbuf 原字节数组
* @param start 开始位置
* @param end 结束位置
* @return 新字节数组
*/
public static byte[] byteCopy(byte[] srcbuf, int start, int end){
byte[] buf = new byte[end-start+1];
for (int i = 0; i < srcbuf.length; i++) {
if(start<=i && i<end){
buf[i-start] = srcbuf[i];
}
}
return buf;
}
}
运行测试代码:
public static void main(String[] args) {
try {
//一行需要几个汉字宽度,当前一行12个汉字
int clen = 12;
List<String> contents = new ArrayList<String>();
contents.add("根据二进制流截取12个汉字为一行的长度内容");
contents.add("根据二进制流截取121个汉字为一行的长度内容");
for (String item : contents) {
System.out.println("内容:"+item);
List<String> lines = lineSplit(item, clen);
int index = 0;
for (String linestr : lines) {
index++;
System.out.println("第"+index+"行:"+linestr);
}
System.out.println("------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
执行结果如下: