java:关于字符编码的试题
2015-08-14 18:46
429 查看
<pre name="code" class="java">/** 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表) 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文 <span style="white-space:pre"> </span>思路:GBK编码中,一个字母占一个字节,切最高位为0;一个汉字占两个字节,最高位都为为1. */ import java.util.*; class Test10 { public static void main(String[] args) throws Exception { String str = "你好HM程序员"; //c从str中截取前3个字节,并返回字符串 String sub = backString(str, 3); System.out.println(sub); } //取字符创str的前n个字节的字符串 public static String backString(String str, int n) throws Exception { //字符串转换为字节数组 byte[] buf = str.getBytes("GBK"); //存储返回的子串 String sub = null; //记录每个字节的最高位 StringBuilder sb = new StringBuilder(); // for(byte b : buf) { String s = Integer.toBinaryString(b&128); char[] ch = s.toCharArray(); sb.append(ch[0]); } //System.out.println(sb); //第n个字节的最高位 char c = sb.charAt(n-1); //System.out.println(c); //如果第n个字节最高位为0,则返回前n个字节的字符串 if(c == '0') { sub = new String(buf, 0, n, "GBK"); } //如果第n个字节最高位为1,则需要记录前n个字节最高位为1的个数count //count为偶数,则该字节只是一个中文字符的一部分,只需返回前n-1个字节的字符串形式 //count为奇数,则第n-1个字节的最高位必也为1,这两个字节正好形成一个中文字符,返回前n个字节的字符串形式 else { int count = 0; //记录'1'在sb中的第n个字符之前出现的次数 char[] s1 = sb.toString().toCharArray(); for(int i = 0; i < n-1 ; i++) { if(s1[i] == '1') { count++; } } if(count%2 == 0) { sub = new String(buf, 0, n-1, "GBK"); } else { sub = new String(buf, 0, n, "GBK"); } } return sub; } }
相关文章推荐
- Java集合框架类图
- JAVA 十六进制与字符串的转换
- 广度优先搜索
- java实现简单算法(三)
- JAVA基本的编程50称号(7-9称号)详细解释
- JAVA实现EXCEL公式专题(六)——查找引用函数
- java最重要类之一——String类部分方法解析
- spring <context:component-scan>使用说明(转)
- spring <context:component-scan>使用说明(转)
- Java几种常用数组排序
- SpringMVC Controller中的service为null
- AS-->Android Studio直接打开/导入/编译Eclipse项目
- #hive_正则表达式#JAVA的正则表达式案例详解
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- Struts1 的html标签的详细讲解与使用
- Java序列化
- java设计模式之五 —— 单例模式的三种模式优缺点整理
- java ssh三大框架搭建整合
- 关于线程调用Spring注解对象报空指针异常
- 可以将openerp改造成java版的工具(基于XML)