工作中遇到一個問題:為保護用戶隱私 在評論區(qū)將用戶名中間的字段使用*號代替
有的奇葩用戶名中夾雜有表情字符,此時使用substring()進行截取操作,結(jié)果就有可能是亂碼或者不符合要求因為JVM運行時使用UTF-16編碼苦酱,實際Java自帶特殊字符截取的方法offsetByCodePoints
例如String 類型的字符串是一組表情, 現(xiàn)在要將他進行一下操作:
String emoji="??????????";
獲取表情個數(shù)
- codePointCount方法返回整個String中的表情個數(shù)给猾,此時codePointCount=5
int codePointCount = emoji.codePointCount(0, emoji.length()); //返回指定文本中的Unicode代碼點數(shù)
截取最后一個表情
sta=4 疫萤,end=5
從第4個開始(不包括) 截取到第5個(包括)
確定截取的位置后,再使用substring截取
int sta =emoji.offsetByCodePoints(0 , codePointCount-1);//獲取倒數(shù)第2個表情結(jié)束的位置(實際也是倒數(shù)第一個表情開始的位置)
int end =emoji.offsetByCodePoints(0 , codePointCount); //獲取最后一個表情結(jié)束的位置
String subEmoji = emoji.substring(sta, end); //subEmoji=??
如果截取第一個敢伸,開始的位置為offsetByCodePoints(0 , 0); 結(jié)束為offsetByCodePoints(0 ,1);
中間三個用***代替
int repSta =emoji.offsetByCodePoints(0 , 1);//不包括第一個表情
int repEnd =emoji.offsetByCodePoints(0 , 4); //范圍取第234個
StringBuffer buffer = new StringBuffer(emoji);
buffer.replace(repSta , repEnd , "***");
System.out.println(" buffer="+buffer.toString()); //buffer=??****??