场景描述:
比如数据库表里面有一个地址描述字段,类型是varchar2(128)(128:表示可以储存128字节的内容),也就是说可以如果全是中文和中文字符的话可以储存48个字符,如果是英文或者数字就可以储存128个字符,所以需要进行校验,判断需要入库的字符串的字节数;
方法1:使用正则表达式把中文和中文字符替换成英文或者数字,然后计算长度;
方法2:定义一个变量,遍历整个字符串,如果是是中文或者中文字符,加2,否则加1,最后得到总长度;
方法3:JS的方式获取;
一、Java代码实现:
package com.zhh1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author zhaoheng
* 2018-07-20
*/
public class Test {
public static void main(String[] args) {
String name = "1E一,.";
System.out.println(getStrByteLength(name));
System.out.println(getStrByteLength1(name));
}
/**
* 匹配
* 如果str符合regex的规则,则返回true否者返回false;
* @param str :待验证的字符
* @param regex :正则表达式规则
* @return
*/
public static boolean checkMatch(String str, String regex)
{
boolean result =true;
try
{
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
result = matcher.matches();
} catch (Exception e)
{
result = false;
}
return result;
}
/**
* 检测字符串的字节数
* @param str 待检测的字符串
* @return 字符串的字节数
*/
public static long getStrByteLength(String str) {
long length=0;
for (int k = 0; k <str.length(); k++) {
//判断是否包含中文或者中文字符
if (Test.checkMatch(String.valueOf(str.charAt(k)), "[\u0391-\uFFE5]")) {
length+=2;
}else {
length+=1;
}
}
return length;
}
/**
* 检测字符串的字节数
* @param str 待检测的字符串
* @return 字符串的字节数
*/
public static long getStrByteLength1(String str) {
// 如果是中文,替换成aa,因为aa刚好是两个字节
long length = str.replaceAll("[\u0391-\uFFE5]", "aa").length();
return length;
}
}
二、Js的方式实现
var str = "1A中,, .。";
var length = str.replace(/[\u0391-\uFFE5]/g,"aa").length;
以上是几种方式的实现,需要的时候直接使用就行了,再也不用担心入库长度校验了