- 问题阐述
- 解决问题
- 字符很长的场景
1、有一个包含中文的字符串,使用java 的substring截取后长度为10例如:
String str = "ab你好cd你好asdfg"; str = str .substring(0,10); str截取后的值为:ab你好cd你好as
2、此时将str保存到一个类型为varchar2(10) 的字段中 会报错:超出字符长度。实际字符长度为18。
解决问题1、为什么会出现上面的问题
因为:中文在UTF-8 编码中占用三个字节,而在GBK编码中占用2个字节。
2、解决问题
public static String subStrUTF8(String string, int num){
int len = string.getBytes(StandardCharsets.UTF_8).length;
if(len > num){
string = string.substring(0, string.length() - 1);
string = subStrUTF8(string,num);
}
return string;
}
3、调用subStrUTF8解决截取的问题。
示例:
String str = "ab你好cd你好asdfg";
System.out.println(subStrUTF8(str,10));
结果为:ab你好cd
字符很长的场景
需求描述: 5000个字符(含有中文),保留前2000位;
如果直接用上面的递归一个一个的截取是不是很耗时。
可以使用如下方式减少截取次数:
public static String substr(String s, int num) {
if (StringUtils.isBlank(s)) {
return "";
}
if (num > s.length()) {
return s;
}
s = s.substring(0, num);
return subStrUTF8(s, num);
}



