1. 程式人生 > >Java:根據位元組數擷取字串,但是漢字不能擷取半個。

Java:根據位元組數擷取字串,但是漢字不能擷取半個。

擷取字串指定指定位元組數的內容,如果指定的位元組數在漢字的中間,漢字不能擷取部分,只擷取前面的內容。

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