问题:
字符串:music<<美丽的草原我的家>>。该字符串的长度即str.length()为:17,而目前需要存入数据库对应的字段长度为:16。所以必须对字符串进行截取。而前16个字节中,“原”字只有半个。这样存入数据库确对会出现“?”。所以必须判断是否是半个汉字,即只能存入“music<<美丽的草”。
分析:
汉字是双字节编码,它为了能够与英文字符分开,每个字节的最高位一定为1。如果是汉字,那么这个字节就是小于0的。这个函数就是通过这一原理实现的。所以要通过getBytes()转化为byte型,再比较与零的大小。
getBytes()是把一个字符串转成一个byte数组,因为计算机的数据都是基于字符的,也就是说一个字符串实际上就是一个字符流,因此可以转为字符数组。
程序:
public static String getStr(String src, int len) {
if (src == null) return null;
if (src.getBytes().length <= len) return src;
byte[] s = src.getBytes();
int flag = 0;
for(int i=0;i<len;++i){
if(s[i] < 0) flag++;
}
if(flag%2!=0) len--;
byte[] d = new byte[len];
System.arraycopy(s, 0, d, 0, len);
return new String(d);
}
字符串:music<<美丽的草原我的家>>。该字符串的长度即str.length()为:17,而目前需要存入数据库对应的字段长度为:16。所以必须对字符串进行截取。而前16个字节中,“原”字只有半个。这样存入数据库确对会出现“?”。所以必须判断是否是半个汉字,即只能存入“music<<美丽的草”。
分析:
汉字是双字节编码,它为了能够与英文字符分开,每个字节的最高位一定为1。如果是汉字,那么这个字节就是小于0的。这个函数就是通过这一原理实现的。所以要通过getBytes()转化为byte型,再比较与零的大小。
getBytes()是把一个字符串转成一个byte数组,因为计算机的数据都是基于字符的,也就是说一个字符串实际上就是一个字符流,因此可以转为字符数组。
程序:
public static String getStr(String src, int len) {
if (src == null) return null;
if (src.getBytes().length <= len) return src;
byte[] s = src.getBytes();
int flag = 0;
for(int i=0;i<len;++i){
if(s[i] < 0) flag++;
}
if(flag%2!=0) len--;
byte[] d = new byte[len];
System.arraycopy(s, 0, d, 0, len);
return new String(d);
}
博客围绕字符串存入数据库时的截取问题展开。当字符串长度超出数据库字段长度,且截取处出现半个汉字时会存入“?”。通过汉字双字节编码,字节最高位为1即小于0的原理,利用getBytes()将字符串转成byte数组判断,给出了相应的Java截取程序。
795

被折叠的 条评论
为什么被折叠?



