从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)【笔记】

来源:互联网 发布:python廖雪峰 pdf 编辑:程序博客网 时间:2024/05/01 23:39
<pre name="code" class="java">/** *  * 需求: * 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表), *  * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要 * 是"HM"而不要出现半个中文 */package com.itheima;public class Test10 {public static void main(String[] args) throws Exception {// 输入要截取的字符串String s = "HM程序员";System.out.println(mySubstring(s, 3));}public static String mySubstring(String s, int length) throws Exception {// 获取一个字符占两个字节的Unicode的编码格式的字节数组byte[] bytes = s.getBytes("Unicode");/*String的getBytes()方法是得到一个系统默认的编码格式的字节数组中文是用unicode进行编码的于是在接收和发送的时候,都必须进行bytes的转换*/// 表示当前的字节数int n = 0;// 要截取的字节数,从第3个字节开始int i = 2;for (; i < bytes.length && n < length; i++) {// 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节if (i % 2 == 1)n++; // 在UCS2第二个字节时n加1else {// 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节if (bytes[i] != 0) {n++;}}}// 如果i为奇数时,处理成偶数if (i % 2 == 1) {// 该UCS2字符是汉字时,去掉这个截一半的汉字if (bytes[i - 1] != 0)i = i - 1;// 该UCS2字符是字母或数字,则保留该字符elsei = i + 1;}return new String(bytes, 0, i, "Unicode");}}


                                             
0 0
原创粉丝点击