JAVA返回指定字符串的长度,Java截取指定字节长度的字符串
在實(shí)際的項(xiàng)目中,我們后臺的數(shù)據(jù)庫是根據(jù)指定編碼(如GBK)保存數(shù)據(jù)的,為防止操作數(shù)據(jù)庫時(shí),因字段值長度超過數(shù)據(jù)庫定義的長度,須在JAVA甚至JS層面做長度的校驗(yàn)控制,如數(shù)據(jù)庫定義的長度是varchar2(10),即10個(gè)字節(jié)的長度,此時(shí)應(yīng)該在JAVA甚至JS層面校驗(yàn)其對應(yīng)數(shù)據(jù)的字節(jié)長度是否小于10,如果超過10,應(yīng)截取為10個(gè)甚至9個(gè)字節(jié)長度(第10、第11個(gè)字節(jié)正好是一個(gè)占兩字節(jié)的字符的情況)。
package com.bijian.study.string;
import java.io.UnsupportedEncodingException;
/**
* Java截取指定字節(jié)長度的字符串
*
* 在實(shí)際的項(xiàng)目中,我們后臺的數(shù)據(jù)庫是根據(jù)指定編碼(如GBK)保存數(shù)據(jù)的,為防止操作數(shù)據(jù)庫時(shí),因字段值長度超過數(shù)據(jù)庫定義的長度,須在JAVA甚至JS層面做長度的校驗(yàn)控制
* 如數(shù)據(jù)庫定義的長度是varchar2(10),即10個(gè)字節(jié)的長度,此時(shí)應(yīng)該在JAVA甚至JS層面校驗(yàn)其對應(yīng)數(shù)據(jù)的字節(jié)長度是否小于10,如果超過10,應(yīng)截取為10個(gè)甚至9個(gè)字節(jié)長度(第10、第11個(gè)字節(jié)正好是一個(gè)占兩字節(jié)的字符的情況)
*/
public class StringTest01 {
public static void main(String [] args) {
String pContent = "1大家都清清楚楚了";
int pLen = 10;
String resultStr = stingLenProcessNok(pContent, pLen);
System.out.println(resultStr);
resultStr = stingLenProcessOk(pContent, pLen);
System.out.println(resultStr);
}
/**
* 截取時(shí)未考慮第pLen、第pLen+1個(gè)字節(jié)為一個(gè)占兩字節(jié)的字符的情況
* @param pContent
* @param pLen
* @return
*/
private static String stingLenProcessNok(String pContent, int pLen) {
//由于JAVA的String的length是判斷字符的個(gè)數(shù),但后臺數(shù)據(jù)庫是根據(jù)指定編碼(如GBK)保存數(shù)據(jù)的,所以JAVA的字符長度判斷需根據(jù)字節(jié)判斷
if(pContent != null) {
try {
byte[] bytes = pContent.getBytes("GBK");
if(bytes.length > pLen) {
int tempLen = new String(bytes, 0, pLen, "GBK").length();
//根據(jù)tempLen長度截取原字符串
pContent = pContent.substring(0, tempLen);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return pContent;
}
/**
* 截取時(shí)考慮了第pLen、第pLen+1個(gè)字節(jié)為一個(gè)占兩字節(jié)的字符的情況
* @param pContent
* @param pLen
* @return
*/
private static String stingLenProcessOk(String pContent, int pLen) {
//由于JAVA的String的length是判斷字符的個(gè)數(shù),但后臺數(shù)據(jù)庫是根據(jù)指定編碼(如GBK)保存數(shù)據(jù)的,所以JAVA的字符長度判斷需根據(jù)字節(jié)判斷
if(pContent != null) {
try {
byte[] bytes = pContent.getBytes("GBK");
if(bytes.length > pLen) {
int tempLen = new String(bytes, 0, pLen, "GBK").length();
//根據(jù)tempLen長度截取原字符串
pContent = pContent.substring(0, tempLen);
bytes = pContent.getBytes("GBK");
//如果第totalLen、第totalLen+1個(gè)字節(jié)正好是一個(gè)漢字,String的substring方法會返回一個(gè)完整的漢字,導(dǎo)致長度為totalLen+1(超過totalLen),所以再次對pContent的長度進(jìn)行字節(jié)判斷與處理
if(bytes.length > pLen) {
pContent = pContent.substring(0, tempLen-1);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return pContent;
}
}
運(yùn)行結(jié)果:
1大家都清清
1大家都清
總結(jié)
以上是生活随笔為你收集整理的JAVA返回指定字符串的长度,Java截取指定字节长度的字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ef mysql 数据模型,EF Cor
- 下一篇: php swool协程,swoole如何