中、日、韩、英双字节字符的判断 0x80
2013-01-02 11:14
295 查看
StringTrimUtils,使用charArray,Java内部使用unicode,不用在意编码
java 代码
public class StringTrimUtils {
/**
* 截取一段字符的长度(汉、日、韩文字符长度为2),不区分中英文,如果数字不正好,则少取一个字符位
*
* @param str 原始字符串
* @param specialCharsLength 截取长度(汉、日、韩文字符长度为2)
* @return
*/
public static String trim(String str, int specialCharsLength) {
if (str == null || "".equals(str) || specialCharsLength < 1) {
return "";
}
char[] chars = str.toCharArray();
int charsLength = getCharsLength(chars, specialCharsLength);
return new String(chars, 0, charsLength);
}
/**
* 获取一段字符的长度,输入长度中汉、日、韩文字符长度为2,输出长度中所有字符均长度为1
* @param chars 一段字符
* @param specialCharsLength 输入长度,汉、日、韩文字符长度为2
* @return 输出长度,所有字符均长度为1
*/
private static int getCharsLength(char[] chars, int specialCharsLength) {
int count = 0;
int normalCharsLength = 0;
for (int i = 0; i < chars.length; i++) {
int specialCharLength = getSpecialCharLength(chars[i]);
if (count <= specialCharsLength - specialCharLength) {
count += specialCharLength;
normalCharsLength++;
} else {
break;
}
}
return normalCharsLength;
}
/**
* 获取字符长度:汉、日、韩文字符长度为2,ASCII码等字符长度为1
* @param c 字符
* @return 字符长度
*/
private static int getSpecialCharLength(char c) {
if (isLetter(c)) {
return 1;
} else {
return 2;
}
}
/**
* 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符)
*
* @param char c, 需要判断的字符
* @return boolean, 返回true,Ascill字符
*/
private static boolean isLetter(char c) {
int k = 0x80;
return c / k == 0 ? true : false;
}
}
为什么要用c/k?
除法是向左做位移,判断最后的结果是否为0既可得出这个字节高位的第一位是1或0.
想想,
这里亦可以求c与k位与之后的值来判断是否为双字节字符.
照这个思路搜到一帖 http://topic.csdn.net/t/20040416/10/2972001.html
StrLenEx为测试字符串长度,但为何要*ptr & 0x80 呢??
short StrLenEx( char *str )
{
char *ptr;
short slength = 0;
for( ptr = str; *ptr != '\0'; )
{
if( *ptr & 0x80 )
ptr += 2;
else
ptr ++;
slength++;
}
return slength;
}
StrLenEx为测试字符串长度,但为何要*ptr & 0x80 呢??
为了识别双字节的字符,比如汉字或日文韩文等都是占两字节的, 每字节高位为1, 而一般西文字符只有一个字节,七位有效编码,高位为0
这个函数返回的是字符串的字符数,对双字节的字符只算一次
if( *ptr & 0x80 ) // 双字节字符 ?
ptr += 2; // 指针后移二位
else
ptr ++; // 指针后移一位
如
"abcdefgh" 字节数=8 字符数=8
"中cdefgh" 字节数=8 字符数=7
0x80对应的二进制代码为1000 0000,最高位为一,代表汉字.汉字编码格式通称为10格式.
一个汉字占2字节,但只代表一个字符
*ptr & 0x80
如果表达式为真,说明 *ptr 高位为 1, 则是双字节字符
java 代码
public class StringTrimUtils {
/**
* 截取一段字符的长度(汉、日、韩文字符长度为2),不区分中英文,如果数字不正好,则少取一个字符位
*
* @param str 原始字符串
* @param specialCharsLength 截取长度(汉、日、韩文字符长度为2)
* @return
*/
public static String trim(String str, int specialCharsLength) {
if (str == null || "".equals(str) || specialCharsLength < 1) {
return "";
}
char[] chars = str.toCharArray();
int charsLength = getCharsLength(chars, specialCharsLength);
return new String(chars, 0, charsLength);
}
/**
* 获取一段字符的长度,输入长度中汉、日、韩文字符长度为2,输出长度中所有字符均长度为1
* @param chars 一段字符
* @param specialCharsLength 输入长度,汉、日、韩文字符长度为2
* @return 输出长度,所有字符均长度为1
*/
private static int getCharsLength(char[] chars, int specialCharsLength) {
int count = 0;
int normalCharsLength = 0;
for (int i = 0; i < chars.length; i++) {
int specialCharLength = getSpecialCharLength(chars[i]);
if (count <= specialCharsLength - specialCharLength) {
count += specialCharLength;
normalCharsLength++;
} else {
break;
}
}
return normalCharsLength;
}
/**
* 获取字符长度:汉、日、韩文字符长度为2,ASCII码等字符长度为1
* @param c 字符
* @return 字符长度
*/
private static int getSpecialCharLength(char c) {
if (isLetter(c)) {
return 1;
} else {
return 2;
}
}
/**
* 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符)
*
* @param char c, 需要判断的字符
* @return boolean, 返回true,Ascill字符
*/
private static boolean isLetter(char c) {
int k = 0x80;
return c / k == 0 ? true : false;
}
}
为什么要用c/k?
除法是向左做位移,判断最后的结果是否为0既可得出这个字节高位的第一位是1或0.
想想,
这里亦可以求c与k位与之后的值来判断是否为双字节字符.
照这个思路搜到一帖 http://topic.csdn.net/t/20040416/10/2972001.html
StrLenEx为测试字符串长度,但为何要*ptr & 0x80 呢??
short StrLenEx( char *str )
{
char *ptr;
short slength = 0;
for( ptr = str; *ptr != '\0'; )
{
if( *ptr & 0x80 )
ptr += 2;
else
ptr ++;
slength++;
}
return slength;
}
StrLenEx为测试字符串长度,但为何要*ptr & 0x80 呢??
为了识别双字节的字符,比如汉字或日文韩文等都是占两字节的, 每字节高位为1, 而一般西文字符只有一个字节,七位有效编码,高位为0
这个函数返回的是字符串的字符数,对双字节的字符只算一次
if( *ptr & 0x80 ) // 双字节字符 ?
ptr += 2; // 指针后移二位
else
ptr ++; // 指针后移一位
如
"abcdefgh" 字节数=8 字符数=8
"中cdefgh" 字节数=8 字符数=7
0x80对应的二进制代码为1000 0000,最高位为一,代表汉字.汉字编码格式通称为10格式.
一个汉字占2字节,但只代表一个字符
*ptr & 0x80
如果表达式为真,说明 *ptr 高位为 1, 则是双字节字符
相关文章推荐
- 如何判断一个字符串中是否含有汉字或汉字标点(即双字节字符)
- 判断字符串是否UTF8, 支持最大6个字节的UTF8字符
- Flex 处理双字节字符(判断汉字长度)的方法
- 判断一个字符是双字节还是单字节
- 判断一个字符是否为汉字的最佳方法 字数,字符,字节统计
- 0x80---判断一个字符是Ascill字符还是其它字符
- Flex中处理双字节字符(判断汉字长度)的方法
- C++判断输入utf8字符的字节数
- JS 判断字符字节长度
- 设计函数,输入为一个字符串,里边包含中文、英文、数字等字符,编码为GBK。中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意。
- 判断字符串中第一位字符是否是ASCII字符( 0–127),ASCII字符占一个字节
- 工具类:网络判断+字符转字节+网络请求
- iOS开发-NSString小拓展-判断是否纯中文-获取字符所占字节
- 判断一个字符是全角还是半角(占一个字节还是两个字节)
- PHP - 判断php是否对表单数据内的特殊字符自动转义
- SQL中判断字符串中包含字符的方法
- 判断字符是否合法
- 字符集(ansi、unicode、utf-8、utf-16、多字节字符(mutil-byte)、宽字节字符)