Java:根據位元組數擷取字串,但是漢字不能擷取半個。
阿新 • • 發佈:2019-02-17
擷取字串指定指定位元組數的內容,如果指定的位元組數在漢字的中間,漢字不能擷取部分,只擷取前面的內容。
package com.lcx.test; import java.io.UnsupportedEncodingException; /** * * 擷取字串指定指定位元組數的內容,如果指定的位元組數在漢字的中間,漢字不能擷取部分,只擷取前面的內容。 如"ab我",擷取3個位元組的字元,如果採用非iso-8859-1編碼 漢字所佔字元超過1個位元組,所以此時只能擷取"ab" 。 題目意思: 應該是字串中不存在亂碼的情況下,如果編碼形式是iso-8859-1,那麼擷取字串就是擷取的位元組格式, 所以主要考核的是非iso-8859-1編碼格式是如何擷取。 思路: 假設擷取 n個位元組, 擷取字串的n個字元,n個字元的GBK編碼的位元組數一定>=要擷取位元組個數,如果等於說明全是字母 如果不等,說明包含漢字,擷取的n個字元的位元組數>需要擷取的n個位元組,故擷取字元n-1, 再次進行比較,直到,位元組數n 和 擷取字串的位元組數相等,那麼所擷取的字串就是結果。 * @author * */ public class SubStringByBytes { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { String en = "a"; String cn = "我"; System.out.println("英文_ISO-8859-1:" + en.getBytes("ISO-8859-1").length); System.out.println("漢字_ISO-8859-1:" + cn.getBytes("ISO-8859-1").length); System.out.println("英文_GBK:" + en.getBytes("GBK").length); System.out.println("漢字_GBK:" + cn.getBytes("GBK").length); System.out.println("英文_UTF-8:" + en.getBytes("UTF-8").length); System.out.println("漢字_UTF-8:" + cn.getBytes("UTF-8").length); String str = "abc我們啊ddd"; /* * 這裡還和擷取何種編碼的位元組數有關,如果擷取9個位元組 * GBK 是 abc我們啊 * UTF8是 abc我們 */ System.out.println(subStringByBytes(str, 9,"gbk")); System.out.println(subStringByBytes(str, 9,"utf-8")); } /** * * @param str 要擷取的字串 * @param bytes 擷取的位元組數 * @return * @throws UnsupportedEncodingException */ public static String subStringByBytes(String str, int bytes,String charSetName) throws UnsupportedEncodingException { String subAfter = str.substring(0, bytes); int temp = bytes; try { //直到擷取的字串的位元組數 和 需要的 擷取的位元組數相等位為止 while(bytes < subAfter.getBytes(charSetName).length){ subAfter = subAfter.substring(0,--temp ); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return subAfter; } /** * * @return 當前系統的編碼格式 */ public static String getSystemEncode() { System.getProperties().list(System.out);// 得到當前的系統屬性。並將屬性列表輸出到控制檯 String encoding = System.getProperty("file.encoding"); System.out.println("Encoding:" + encoding); return encoding; } }
重點就是要區分英文單個字串和漢字單個字串的不同,在非iso-8859-1的情況下都不相同,這樣就可以進行區分了。
結果截圖:
漢字在各種編碼下所佔位元組數請見:
http://www.cnblogs.com/lancidie/archive/2013/04/12/3017241.html