黑马程序员技术交流社区
标题:
编程题:截取有汉字的字符串的函数
[打印本页]
作者:
孙辉辉
时间:
2012-12-16 10:49
标题:
编程题:截取有汉字的字符串的函数
题目:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
只是不知道如果判断一个是不是汉字,求思路。另外如果要截取的为1,是不是就输出为空呢?
作者:
Kevin123
时间:
2012-12-16 14:23
给楼主点思路,先字符串转化为数组,然后统计截取长度中汉字所占的字节数,一个汉字占两个字节,通过统计值奇偶数来判断是否截半。
byte st[]=str.getBytes();
if(st[i] < 0) //st[i]所存字节为汉字,其值小于零,count值加一。
++count;
应该很明了了,楼主具体实现吧
作者:
王晨
时间:
2012-12-16 16:48
Java判断一个字符串是否有中文是利用Unicode编码来判断,因为中文的编码区间为:0x4e00--0x9fbb,不过通用区间来判断中文也不非常精确,因为有些中文的标点符号利用区间判断会得到错误的结果。而且利用区间判断中文效率也并不高,例如;str.substring(i, i + 1).matches("[\\u4e00-\\u9fbb]+"),就需要遍历整个字符串,如果字符串太长效率非常低,而且判断标点还会错误。
我再网上看到的这个代码,感觉效率挺高的.你可以试试看……
package com.zakisoft.ch;
public class IsChineseOrNot {
// GENERAL_PUNCTUATION 判断中文的“号
// CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
// HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号
private static final boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
public static final boolean isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (isChinese(c)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
System.out.println(isChinese("き"));
System.out.println(isChinese("test,.?!%^&*(){}[]"));
System.out.println(isChinese("测试"));
System.out.println(isChinese("“测试”,。?!%……&*()——{}【】”"));
}
public static final boolean isChineseCharacter(String chineseStr) {
char[] charArray = chineseStr.toCharArray();
for (int i = 0; i < charArray.length; i++) {
if ((charArray[i] >= 0x4e00) && (charArray[i] <= 0x9fbb)) {
return true;
}
}
return false;
}
/**
* @deprecated; 弃用。和方法isChineseCharacter比效率太低。
* */
public static final boolean isChineseCharacter_f2() {
String str = "!?";
for (int i = 0; i < str.length(); i++) {
if (str.substring(i, i + 1).matches("[\\u4e00-\\u9fbb]+")) {
return true;
}
}
return false;
}
}
复制代码
我运行了一下,可以判断是否为字符,你试试能不能用!
作者:
孙辉辉
时间:
2012-12-16 22:09
根据以上思路,和之后网上的一些资料,自己写了一个
public static String splitString(String str,int byteLength) {
//如果字符串为空或者长度为0,则返回原串
if(str==null||str.length()==0)
return str;
//定义字节数组来存经GBK转换后的 byte序列
byte[] strByte = null;
try {
strByte = str.getBytes("GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//定义存储要截取段汉字字节数,初始化为0
int wordCount = 0;
//统计截取段所含有的汉字字节数
for(int i = 0;i <byteLength;i++){
int num = strByte[i];//num小于零是汉字,汉字通过strByte方法取出之后是小于零的
// 如果是汉字(负),则统计截取字符串中的汉字所占字节数
if(num < 0){
wordCount++;
}
}
//如果汉字占奇数个字节数,则说明要截取了半个汉字,应当做是一个来处理
if(wordCount % 2 == 1)
wordCount = wordCount + 1;
//subString 的截取长度应该为要截取的字节数-其中包括的汉字个数(wordCount/2)
return str.substring(0, (byteLength-(wordCount/2)));
}
public static void main(String[] args) {
//定义一个字符串
String str = "我ABC汉DEF";
System.out.println(splitString(str,7));
}
复制代码
作者:
高焕杰
时间:
2012-12-16 23:38
这样可能更简单:
public class Test
{
/**
* @param str 输入的字符串
* @param length 欲截取的字节数
* @param flag 旗标
*/
public void test(String str,int length){
String newStr=str.substring(0, length);
String regEx = "[\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(newStr);
int count=0;
while (m.find()) {
for (int i = 0; i <= m.groupCount(); i++) {
count = count + 1;
}
}
if (count==0) {//所截字符串中没有汉字。
System.out.println(newStr);
}
else{//所截字符串中含有汉字。
System.out.println(newStr.substring(0,(length-count)));
}
}
public static void main(String[] args)
{
new Test().test("我ABC汉DEF", 6);//结果为:我ABC
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2