Java 判斷中英文、解析中文字符佔用的字節、獲取字符串相對於漢字的個數

Java中判斷字符串的編碼有兩種思路:

(1)是根據byte的長度判斷,英文的字母數字好標點符號都是一個byte,且值在0-255之間

(2)是根據中文的Unicode取值範圍判斷,這個就是把所以的範圍都包含,才能判斷正確,參考unicode中文範圍:

示例代碼:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringTest {
// --------------------------第一種方式----------------------------
 //英文佔1byte,非英文(可認爲是中文)佔一個以上,根據這個特性來判斷字符
 public static boolean checkChar(char ch) {
  if ((ch + "").getBytes().length == 1) {
   return true;//英文
  } else {
// 注意:GBK、GB2312下中文佔兩個字節,UTF-8下中文佔三個字節,不能判斷字符佔兩個字節是中文
// 關於中文字節及編碼格式可以看文末的鏈接
   return false;//中文
  }
 }
// --------------------------第二種方式----------------------------
 public static String checkString(String str) {
  String res = "";
  if (str != null) {
   for (int i = 0; i < str.length(); i++) {
    //只要字符串中有中文則爲中文
    if (!checkChar(str.charAt(i))) {
     res = "中文";
     break;
    } else {
     res = "英文";
    }
   }
  }
  return res;
 }
 //判斷是不是中文
 public 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;
 }
 //判斷是不是英文字母
 public static boolean isEnglish(String charaString) {
  return charaString.matches("^[a-zA-Z]*");
 }
 //根據中文unicode範圍判斷u4e00 ~ u9fa5不全
 public static String isChinese(String str) {
  String regEx1 = "[\\u4e00-\\u9fa5]+";
  String regEx2 = "[\\uFF00-\\uFFEF]+";
  String regEx3 = "[\\u2E80-\\u2EFF]+";
  String regEx4 = "[\\u3000-\\u303F]+";
  String regEx5 = "[\\u31C0-\\u31EF]+";
  Pattern p1 = Pattern.compile(regEx1);
  Pattern p2 = Pattern.compile(regEx2);
  Pattern p3 = Pattern.compile(regEx3);
  Pattern p4 = Pattern.compile(regEx4);
  Pattern p5 = Pattern.compile(regEx5);
  Matcher m1 = p1.matcher(str);
  Matcher m2 = p2.matcher(str);
  Matcher m3 = p3.matcher(str);
  Matcher m4 = p4.matcher(str);
  Matcher m5 = p5.matcher(str);
  if (m1.find() || m2.find() || m3.find() || m4.find() || m5.find())
   return "中文";
  else
   return "英文";
 }
 public static void main(String[] args) {
  System.out.println("使用長度判斷:");
  System.out.println(checkString("Hello++"));
  System.out.println(checkString("Hello++。、,?"));
  System.out.println(checkString("Hello++編程"));
  System.out.println(checkString("編程"));
    
  System.out.println("\r\n使用正則表達式判斷:");
  System.out.println(isChinese("Hello++"));
  System.out.println(isChinese("Hello++。、,?"));
  System.out.println(isChinese("Hello++編程"));
  System.out.println(isChinese("編程"));
    
  System.out.println("\r\n使用Character.UnicodeBlock");
  System.out.println(isChinese('h')?"中文":"英文");
  System.out.println(isChinese(',')?"中文":"英文");
  System.out.println(isChinese('。')?"中文":"英文");
  System.out.println(isChinese('編')?"中文":"英文");
 }
}

Java一個漢字佔幾個字節(詳解與原理)

有時我們需根據漢字的個數加上單個漢字的尺寸來判斷字符串佔據的寬度或高度。獲取字符串相對於漢字的個數:

    /**
     * 獲取字符串相對於漢字的個數
     * @param text 字符串
     * @return 字符串相對於漢字的個數
     */
    private static double getChineseTypeCount(String text){
        char[] textCharArray = text.toCharArray();
        double chineseTypeLength = 0;
        for(char textChar : textCharArray){
            int textCharByteLength = String.valueOf(textChar).getBytes().length;
            if(textCharByteLength == 1){
                chineseTypeLength += 0.5;
            } else {
                chineseTypeLength++;
            }
        }

        return chineseTypeLength;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章