黑马程序员技术交流社区
标题:
关于字符编码的试题
[打印本页]
作者:
Apol
时间:
2015-7-25 23:03
标题:
关于字符编码的试题
本帖最后由 Apol 于 2015-7-25 23:09 编辑
<div class="blockcode"><blockquote>/**
编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
思路: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;
}
}
复制代码
作者:
Apol
时间:
2015-7-25 23:15
可以不用记录前n-1个字节最高位为1的个数,可直接判断第n-1个字节的最高位是否为1,即:if(s1[n-2] == '1'),但是,当n=1时,判断不了,需要重新对n=1的情况进行判断。
作者:
AI_96
时间:
2015-8-2 14:01
前途无量。。
作者:
李峥
时间:
2015-8-2 22:38
学习学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2