打印机打印字符串转字节数组截取半个中文导致的乱码问题

    打印机打印的时候  要求:打印一行文字,但这行文字实际长度 len(单位是:px)是固定的

  这时候我们的思路是  :GBK编码下汉字占用两个字节,而且这两个字节都是负数,char型字符占用一个字节,

每个汉字占用的宽度是24px   每个char型占用的宽度是12px    换言之每个字节占用的打印宽度是12px

本行所容纳的字节个数 num=len / 12;

  这时候我们将字符串转为字节数组  截取num个字节放到字节数组,然后转为字符串就是该行打印的字符串

但是有个问题就是 当我们截取的最后一个字节是汉字的一半(汉字由2个字节组成) 这个时候就会出现乱码,怎么破?

其实很简单  统计这num个字节中值为负数 的个数 如果是偶数说明没有截取半个汉字的情况出现,

如果是奇数说明有半个汉字的情况出现

这里有个重点  将字符串转换为字节数组时要转为GBK编码 的字节数组   因为 在GBK编码下汉字占用两个字节,而且都是负数,方便统计

            String str="双节棍爱好友h为太原";

            byte[]source=str.getBytes("GBK");                    
  public boolean isHasHalfChiness(byte[] source){
        int count=0;
        for (int i = 0; i < source.length; i++) {
            if(source[i]<0){
                count++;
            }
        }
        return count%2 == 0 ? false : true;
    }

遇到有半个汉字的情况就不截取最后一个字节就OK了  然后其他的另起一行打印什么的就不用说了

大家遇到打印机这方面问题的可以找我交流,共同学习进步!

          严禁盗版    

   转载请注明出处:https://www.cnblogs.com/bimingcong/p/9185587.html

原文地址:https://www.cnblogs.com/bimingcong/p/9185587.html

时间: 2024-10-10 22:11:23

打印机打印字符串转字节数组截取半个中文导致的乱码问题的相关文章

【java解惑】字符串的字节数组构造函数使用

如下代码: public class Example018 { public static void main(String[] args) { byte bs[] = new byte[256]; for (int i = 0; i < 256; i++) { bs[i] = (byte) i; } string(bs);// 调用1 string(bs, "iso-8859-1");// 调用2 string(bs, "gbk");// 调用3 strin

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

C# 16进制与字符串、字节数组之间的转换(转)

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+C

java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

原文:java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等 源代码下载:http://www.zuidaima.com/share/1550463397366784.htm ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等 **应用场景: ** 1. 文件上传 2. js / css / img 等文件读取输出. 转字符串输出 (js & css) , 转字节数组输出 (img .. swf

C# 字符串与字节数组相互转换

总结归纳:如果直接从System.String类中找到方法进行字符串和字节数组之间的转换,是不太可能的.为了使其之间进行转换,需要借助另外一个类型:System.Text.Encoding.这个类型提供了将C#字符串转换成字节数组的方法,也提供了将C# 字节数组转换成字符串. System.Text.Encoding类型的默认构造函数不太可用,不过该类型提供了几种默认的静态属性.如下: 1 // 2 // 摘要: 3 // 获取 ASCII(7 位)字符集的编码. 4 // 5 // 返回结果:

C#串口通讯,16进制与字符串、字节数组之间的转换。

1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));//十进制转十六进制Console.WriteLine("十进制166的十六进制表示: "+Convert.ToStrin

C# 字节数组截取

byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 如果截取2位.4位或者8位长度的字节数组,可以分别用 BitConverter.ToInt16.BitConverter.ToInt32.BitConverter.ToInt64截取,例如,从第3位开始截取4个字节则 BitConverter.ToInt32(data,3): 如果截取的位数不规则,则使用另一种方法,例如,从第5位开始截取3个字节则 data.Skip(5).Ta

字符串、字节数组、流之间的相互转换以及文件MD5的计算

1 using System; 2 using System.IO; 3 using System.Security.Cryptography; 4 using System.Text; 5 6 namespace myMethod 7 { 8 class lgs 9 { 10 static void Main() 11 { 12 Console.ReadKey(); 13 } 14 15 /// <summary> 16 /// 使用不同的编码格式将 字符串 → 字节数组 17 /// &l

getBytes()---&gt;字符串转字节数组

是String的一个方法String的getBytes()方法是得到一个系统默认的编码格式的字节数组getBytes("utf-8") 得到一个UTF-8格式的字节数组把String转换成bytes,各种编码转换成的bytes不同,比如UTF-8每个汉字转成3bytes,而GBK转成2bytes,所以要说明编码方式,否则用缺省编码.