java代碼實現(xiàn)判斷字符串是否為亂碼
一、介紹
字符串亂碼檢測:一個簡單但局限的實現(xiàn)方案
這段代碼實現(xiàn)了一個基于ASCII可打印字符范圍的亂碼檢測函數(shù),通過正則表達式判斷字符串是否包含非標(biāo)準(zhǔn)ASCII字符。
public static boolean isGarbage(String str) {
//檢查字符串是否為空
if (str == null I str.isEmpty()) {
return true;//認(rèn)為空字符串是亂碼
}
//使用正則表達式檢查字符串是否只包含可打印字符
//可打印字符范圍:0x20(space)到0x7E(tide)
return !str.matches("[\\x20-\\x7E]*");
}工作原理:
- 正則表達式[\\x20-\\x7E]*匹配所有ASCII可打印字符(空格到波浪號)
- 如果字符串完全由這些字符組成,返回false(不是亂碼)
- 否則返回true(認(rèn)為是亂碼)
二、代碼
public class StringUtils {
// 判斷字符串是否為亂碼
public static boolean isGarbage(String str) {
// 檢查字符串是否為空
if (str == null || str.isEmpty()) {
return true; // 認(rèn)為空字符串是亂碼
}
// 使用正則表達式檢查字符串是否只包含可打印字符
// 可打印字符范圍: 0x20 (space) 到 0x7E (tilde)
// 這里可以根據(jù)實際需求調(diào)整
return !str.matches("[\\x20-\\x7E]*");
}
public static void main(String[] args) {
String test1 = "???????????"; // 亂碼
String test2 = "W1111A1111"; // 正常字符串
System.out.println("Test 1 is garbage: " + isGarbage(test1)); // true
System.out.println("Test 2 is garbage: " + isGarbage(test2)); // false
}
}
三、方法補充
1.java判斷字符串是否為亂碼
java.nio.charset.Charset.forName("GBK").newEncoder().canEncode("測試") //判斷是不是GBK編碼 即是否亂碼
//使用request.getQueryString()獲取通過URL傳過來的值 有可能是亂碼 如:q=é?¥
String s = request.getQueryString();
if(s!=null){
if(!(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(s))){
try {
s = new String(request.getQueryString().getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}2.Java判斷文字是否亂碼
該代碼段提供了一個Java方法,用于檢測字符串是否包含亂碼。它首先去除字符串中的空白字符和標(biāo)點符號,然后判斷剩余字符是否為數(shù)字、英文或中日韓文字。如果非這些字符的比例超過40%,則認(rèn)為字符串包含亂碼。
/**
* 判斷字符串是否是亂碼
*
* @param strName 字符串
* @return 是否是亂碼
*/
public static boolean isMessyCode(String strName) {
float count = 0;
//去除字符串中的空格 制表符 換行 回車
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("");
//去除字符串中的標(biāo)點符號
String temp = after.replaceAll("\\p{Punct}", "").replaceAll("“|”|!|:|,|?|、|…|\\+","").replaceAll(" ","").replaceAll("\\s\\S*","");
//處理之后轉(zhuǎn)換成字符數(shù)組
char[] ch = temp.trim().toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
//判斷是否是數(shù)字或者英文字符
if (!judge(c)) {
//判斷是否是中日韓文
if (!isChinese(c)) {
//如果不是數(shù)字或者英文字符也不是中日韓文則表示是亂碼返回true
//System.out.println(c);
count++;
}
}
}
float rate = count/ch.length;
if(rate>0.4){
return true;
}
//表示不是亂碼 返回false
return false;
}
public static boolean judge(char c){
if((c >='0' && c<='9')||(c >='a' && c<='z' || c >='A' && c<='Z')){
return true;
}
return false;
}
/**
* 判斷是否是中日韓文字
* @param c 要判斷的字符
* @return true或false
*/
private static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}3.java如何判斷字符串是否有亂碼
要判斷字符串是否有亂碼,我們可以依據(jù)以下幾個步驟:
- 指定編碼:確定我們期望使用的字符編碼( UTF-8、GBK等等)。
- 驗證編碼:嘗試將字符串編碼為字節(jié)數(shù)組,然后再以相同編碼解碼回來,最后檢查解碼后的結(jié)果是否與原始字符串一致。
- 檢測非法字符:對字符串進行逐字符檢查,判斷是否存在未能正確解碼的字符。
- 返回結(jié)果:根據(jù)上述判斷結(jié)果輸出是否存在亂碼。
代碼示例
import java.nio.charset.Charset;
public class StringValidator {
/**
* 根據(jù)指定編碼判斷字符串是否有亂碼
*
* @param str 待檢測的字符串
* @param charsetName 指定的字符編碼
* @return 如果字符串有亂碼返回true,反之返回false
*/
public static boolean hasGarbage(String str, String charsetName) {
if (str == null || charsetName == null) {
return false; // null 時不判斷
}
Charset charset = Charset.forName(charsetName);
try {
// 將字符串編碼為字節(jié)數(shù)組
byte[] bytes = str.getBytes(charset);
// 用相同的編碼解碼
String decodedStr = new String(bytes, charset);
// 判斷原字符串和解碼后的字符串是否一致
return !str.equals(decodedStr);
} catch (Exception e) {
e.printStackTrace(); // 輸出異常信息
return true; // 捕獲異常時認(rèn)為有亂碼
}
}
public static void main(String[] args) {
String testStr = "測試字符串"; // 需要測試的字符串
String charset = "UTF-8"; // 可選的編碼格式
boolean result = hasGarbage(testStr, charset);
if (result) {
System.out.println("字符串存在亂碼");
} else {
System.out.println("字符串無亂碼");
}
}
}代碼解析
hasGarbage方法:此方法負(fù)責(zé)判斷輸入的字符串是否有亂碼。首先,輸入?yún)?shù)為待驗證的字符串和字符編碼。- 編碼與解碼:使用
getBytes方法將字符串轉(zhuǎn)換為字節(jié)數(shù)組,再用new String構(gòu)造函數(shù)基于相同字符集進行解碼。 - 比較原字符串與解碼字符串:若兩者不相等,則表示存在亂碼。
- 異常處理:在處理時對可能出現(xiàn)的異常進行捕獲,并返回有亂碼的結(jié)果。
到此這篇關(guān)于java代碼實現(xiàn)判斷字符串是否為亂碼的文章就介紹到這了,更多相關(guān)java字符串判斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Java和PostgreSQL枚舉之間轉(zhuǎn)換的通用方法
枚舉類型(enum)是一種方便的數(shù)據(jù)類型,允許我們指定一個常量列表,對象字段或數(shù)據(jù)庫列可以設(shè)置為該列表中的值,在本文中,我將回顧處理Java和PostgreSQL枚舉轉(zhuǎn)換的通用方法,需要的朋友可以參考下2023-10-10
MybatisPlus使用idworker解決雪花算法重復(fù)
本文主要介紹了MybatisPlus使用idworker解決雪花算法重復(fù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Spring Boot中使用Actuator的/info端點輸出Git版本信息
這篇文章主要介紹了Spring Boot中使用Actuator的/info端點輸出Git版本信息,需要的朋友可以參考下2017-06-06
Spring Boot管理用戶數(shù)據(jù)的操作步驟
SpringBoot結(jié)合Thymeleaf模板引擎,可以快速搭建Web應(yīng)用,介紹了使用SpringBoot處理JSON數(shù)據(jù)的基本過程,包括創(chuàng)建實體類、視圖頁面和控制器,通過這些步驟,即可完成基于SpringBoot和Thymeleaf的簡單Web開發(fā),感興趣的朋友跟隨小編一起看看吧2024-09-09
spring boot使用sharding jdbc的配置方式
這篇文章主要介紹了spring boot使用sharding jdbc的配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

