首页 > 其他分享 >Unicode与中文转换工具类

Unicode与中文转换工具类

时间:2023-09-14 14:38:49浏览次数:39  
标签:case 中文 outBuffer 转换 int char Unicode aChar append


在上一家公司做Android注入时,如果注入中文会有问题,需要将中文转换为unicode码注入,在网上查了一下转换工具类,大多数都是如下的解决方案:

 

public class CharacterSetToolkit {
    
     /** Creates a new instance of CharacterSetToolkit */
     public CharacterSetToolkit() {
     }
    
     private static final char[] hexDigit = {
         '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
     };
    
     private static char toHex(int nibble) {
         return hexDigit[(nibble & 0xF)];
     }
    
     /**
      * 将字符串编码成 Unicode 。
      * @param theString 待转换成Unicode编码的字符串。
      * @param escapeSpace 是否忽略空格。
      * @return 返回转换后Unicode编码的字符串。
      */
     public static String toUnicode(String theString, boolean escapeSpace) {
         int len = theString.length();
         int bufLen = len * 2;
         if (bufLen < 0) {
             bufLen = Integer.MAX_VALUE;
         }
         StringBuffer outBuffer = new StringBuffer(bufLen);

         for(int x=0; x<len; x++) {
             char aChar = theString.charAt(x);
             // Handle common case first, selecting largest block that
             // avoids the specials below
             if ((aChar > 61) && (aChar < 127)) {
                 if (aChar == '\\') {
                     outBuffer.append('\\'); outBuffer.append('\\');
                     continue;
                 }
                 outBuffer.append(aChar);
                 continue;
             }
             switch(aChar) {
                 case ' ':
                     if (x == 0 || escapeSpace) 
                         outBuffer.append('\\');
                     outBuffer.append(' ');
                     break;
                 case '\t':outBuffer.append('\\'); outBuffer.append('t');
                           break;
                 case '\n':outBuffer.append('\\'); outBuffer.append('n');
                           break;
                 case '\r':outBuffer.append('\\'); outBuffer.append('r');
                           break;
                 case '\f':outBuffer.append('\\'); outBuffer.append('f');
                           break;
                 case '=': // Fall through
                 case ':': // Fall through
                 case '#': // Fall through
                 case '!':
                     outBuffer.append('\\'); outBuffer.append(aChar);
                     break;
                 default:
                     if ((aChar < 0x0020) || (aChar > 0x007e)) {
                         outBuffer.append('\\');
                         outBuffer.append('u');
                         outBuffer.append(toHex((aChar >> 12) & 0xF));
                         outBuffer.append(toHex((aChar >>   8) & 0xF));
                         outBuffer.append(toHex((aChar >>   4) & 0xF));
                         outBuffer.append(toHex( aChar         & 0xF));
                     } else {
                         outBuffer.append(aChar);
                     }
             }
         }
         return outBuffer.toString();
     }
    
     /**
      * 从 Unicode 码转换成编码前的特殊字符串。
      * @param in Unicode编码的字符数组。
      * @param off 转换的起始偏移量。
      * @param len 转换的字符长度。
      * @param convtBuf 转换的缓存字符数组。
      * @return 完成转换,返回编码前的特殊字符串。
      */
     public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
         if (convtBuf.length < len) {
             int newLen = len * 2;
             if (newLen < 0) {
                 newLen = Integer.MAX_VALUE;
             }
             convtBuf = new char[newLen];
         }
         char aChar;
         char[] out = convtBuf;
         int outLen = 0;
         int end = off + len;

         while (off < end) {
             aChar = in[off++];
             if (aChar == '\\') {
                 aChar = in[off++];
                 if (aChar == 'u') {
                     // Read the xxxx
                     int value = 0;
                     for (int i = 0; i < 4; i++) {
                         aChar = in[off++];
                         switch (aChar) {
                         case '0':
                         case '1':
                         case '2':
                         case '3':
                         case '4':
                         case '5':
                         case '6':
                         case '7':
                         case '8':
                         case '9':
                             value = (value << 4) + aChar - '0';
                             break;
                         case 'a':
                         case 'b':
                         case 'c':
                         case 'd':
                         case 'e':
                         case 'f':
                             value = (value << 4) + 10 + aChar - 'a';
                             break;
                         case 'A':
                         case 'B':
                         case 'C':
                         case 'D':
                         case 'E':
                         case 'F':
                             value = (value << 4) + 10 + aChar - 'A';
                             break;
                         default:
                             throw new IllegalArgumentException(
                                     "Malformed \\uxxxx encoding.");
                         }
                     }
                     out[outLen++] = (char) value;
                 } else {
                     if (aChar == 't') {
                         aChar = '\t';
                     } else if (aChar == 'r') {
                         aChar = '\r';
                     } else if (aChar == 'n') {
                         aChar = '\n';
                     } else if (aChar == 'f') {
                         aChar = '\f';
                     }
                     out[outLen++] = aChar;
                 }
             } else {
                 out[outLen++] = (char) aChar;
             }
         }
         return new String(out, 0, outLen);
     }
     
}

使用方法如下:

 

public static void main(String[] args){
    	 String theString="中文汉字+123";
    	 System.out.println(cstk.toUnicode(theString, false));
    	 System.out.println(cstk.fromUnicode(theString.toCharArray(), 0, theString.length(), new char[1024]));
     }

希望对看到的人有所帮助。

标签:case,中文,outBuffer,转换,int,char,Unicode,aChar,append
From: https://blog.51cto.com/u_6978506/7470086

相关文章

  • 振弦传感器信号转换器在岩土工程监测中的注意事项
    振弦传感器信号转换器在岩土工程监测中的注意事项振弦传感器是岩土工程中常用的一种监测设备,用于监测土体和岩体的振动情况。而振弦传感器信号转换器则是将传感器所获得的振动信号转换为人类可读的数据,以方便监测人员进行数据分析和工程决策。 然而,在使用振弦传感器信号转换......
  • 差分信号隔离转换称重传感器压力应变桥信号处理隔离变送器0-10mV/0-20mV/0-±10mV/0-
    主要特性DIN11IPO压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输出端提供隔离的电源......
  • 关于 unicode ABAP 程序的变量名不允许出现特殊字符的问题
    看下面这段程序:DATA:lv_囧TYPEchar1.默认情况下,ABAP程序里的变量名不允许出现特殊字符,比如囧。错误消息中提到在Unicode程序中,字符"囧"不能出现在名称中,例如在名称"LV_囧"中。这个错误消息是由ABAP编程语言引擎生成的,它告诉你在你的ABAP程序中有一个不允许的字......
  • glob:Python中文件名的匹配
    前言既然在Pathlib库中提到了glob()函数,那么我们就专门用一篇内容讲解文件名的匹配。其实我们有专门的一个文件名匹配库就叫:glob。不过,glob库的API非常小,但是仅仅应用于文件名的匹配绰绰有余。只要是在实际的项目中需要过滤,或者匹配一组文件,都可以使用该库进行操作。通配符星......
  • 论文研读_大规模多目标优化问题的两阶段多任务转换框架
    本文的创新点在哪里采用两阶段框架的方式来处理大规模多目标优化问题第一阶段,采用多任务优化策略和双向搜索策略,它将多目标问题改编为决策空间中的多任务问题,以增强收敛性利用双向搜索策略与MFEA相结合,将多目标问题转化为多任务问题第二阶段,提出的算法将多任务优化应......
  • 校验密码必【不能带有中文字符以及中文】
     ^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_][^\u4E00-\u9FFF\uFF00-\uFFEF\u3000-\u303F]{7,16}$ 表示校验密码必须有大小写字母、数字、特殊字符三种以上并且不能带有中文字符以及中文  varregexpEx......
  • Go每日一库之8:cast(类型转换)
    简介今天我们再来介绍spf13大神的另一个库cast。cast是一个小巧、实用的类型转换库,用于将一个类型转为另一个类型。最初开发cast是用在hugo中的。快速使用先安装:$gogetgithub.com/spf13/cast后使用:packagemainimport("fmt""github.com/spf13/cast")fun......
  • 狸窝全能视频转换器
    狸窝全能视频转换器是一款视频转换工具。狸窝全能视频转换器可以将你的视频转换为MP4格式,方便您在手机,iPad上观看,不仅可以转换视频,还可以转换音频文件。狸窝全能视频转换器软件特色、狸窝全能视频转换器可以根据用户需求,选择合适的视频参数,如输出视频质量、尺寸、分辨率等。、狸窝......
  • ubuntu 设置中文输入法
    首先没有汉语输入法时,要用力点击那个chinese:才会展开汉语输入法:如图,选(汉语)是没用的,应该选(汉语带后缀的某一个即可)......
  • 17-浮点数-自动转换-强制转换-增强赋值运算符
         ......