1. 程式人生 > >限制Edittext輸入的位元組長度

限制Edittext輸入的位元組長度

在給裝置重新命名時,裝置對名字的儲存空間一般都是多少位元組,而並非多少字,並通常都是採用utf-8的編碼。
那問題來了,utf-8的編碼是1-6個位元組的不等長度,如何獲取將一個超過30位元組的文字轉換到30位元組以內?

Java中獲取utf-8文字的位元組長度很簡單,如下:

text.getBytes("utf-8").length

但是在把超過30個位元組的字串擷取到30個位元組的時候會導致亂碼。
如字串長度是31位元組,字串最後一個是漢字,漢字一般佔用3個位元組,也就是第[29,30,31]個位元組才表示一個漢字,如果擷取到30,那麼最後的漢字只剩下[29,30]兩位來表示了,這個時候就出現先了亂碼。
現在就是如何解決取整移除一個字元,防止亂碼的出現。
第一步,先把字串轉換為char陣列,char在Java中佔用兩位位元組,採用unicode編碼;
第二步,把每個char的unicode轉換為utf-8編碼的長度,計算char的總長  

   |  Unicode符號範圍       |  UTF-8編碼方式  
 n |  (十六進位制)            | (二進位制)  
---+-----------------------+------------------------------------------------------  
 1 | 0000 0000 - 0000 007F |                                              0xxxxxxx  
 2 | 0000 0080 - 0000 07FF |                                     110xxxxx 10xxxxxx  
 3 | 0000 0800 - 0000 FFFF |                            1110xxxx 10xxxxxx 10xxxxxx  
 4 | 0001 0000 - 0010 FFFF |                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
 5 | 0020 0000 - 03FF FFFF |          111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
 6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  

根據如上Unicode符號與UTF-8編碼的對應關係,可以編寫一下程式來限制位元組長度:

public static String getWholeText(String text, int byteCount){
    try {
        if (text != null && text.getBytes("utf-8").length > byteCount) {
            char[] tempChars = text.toCharArray();
            int sumByte = 0;
            int charIndex = 0;
            for (int i = 0, len = tempChars.length; i < len; i++) {
                char itemChar = tempChars[i];
                // 根據Unicode值,判斷它佔用的位元組數
                if (itemChar >= 0x0000 && itemChar <= 0x007F) {
                    sumByte += 1;
                } else if (itemChar >= 0x0080 && itemChar <= 0x07FF) {
                    sumByte += 2;
                } else {
                    sumByte += 3;
                }
                if (sumByte > byteCount) {
                    charIndex = i;
                    break;
                }
            }
            return String.valueOf(tempChars, 0, charIndex);
        }
    } catch (UnsupportedEncodingException e) {
    }
    return text;
}

由於一個char只有兩位,最多隻能表示utf-8格式的3個位元組,這裡按照這種方式處理。
另外前面有說utf-8位元組的長度是1-6位,這裡只計算了3位以內表示的字元,依然不夠嚴謹。下期將給出更為完善的計算方式,可以先參考來實現六位的表示。


附上限制Edittext輸入的程式碼:

public class MaxLimitTextWatcher implements TextWatcher {

	private int mMaxBytes;
	private EditText mEditText;
	
	public MaxLimitTextWatcher(EditText editText, int maxBytes) {
		mEditText = editText;
		mMaxBytes = maxBytes;
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
		
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		Editable editable = mEditText.getText();  
        int len = editable.toString().getBytes().length;  
          
        if(len > mMaxBytes)  
        {
            int selEndIndex = Selection.getSelectionEnd(editable);  
            String str = editable.toString();  
            //擷取新字串  
            String newStr = getWholeText(str, mMaxBytes);
            mEditText.setText(newStr);  
            editable = mEditText.getText();  
              
            //新字串的長度  
            int newLen = editable.length();
            //舊游標位置超過字串長度  
            if(selEndIndex > newLen)  
            {
                selEndIndex = editable.length();  
            }
            //設定新游標所在的位置  
            Selection.setSelection(editable, selEndIndex);  
        }
	}

	@Override
	public void afterTextChanged(Editable s) {
		
	}
	
	public static String getWholeText(String text, int byteCount){
	    try {
	        if (text != null && text.getBytes("utf-8").length > byteCount) {
	            char[] tempChars = text.toCharArray();
	            int sumByte = 0;
	            int charIndex = 0;
	            for (int i = 0, len = tempChars.length; i < len; i++) {
	                char itemChar = tempChars[i];
	                // 根據Unicode值,判斷它佔用的位元組數
	                if (itemChar >= 0x0000 && itemChar <= 0x007F) {
	                    sumByte += 1;
	                } else if (itemChar >= 0x0080 && itemChar <= 0x07FF) {
	                    sumByte += 2;
	                } else {
	                    sumByte += 3;
	                }
	                if (sumByte > byteCount) {
	                    charIndex = i;
	                    break;
	                }
	            }
	            return String.valueOf(tempChars, 0, charIndex);
	        }
	    } catch (UnsupportedEncodingException e) {
	    }
	    return text;
	}

}


相關推薦

限制Edittext輸入位元組長度

在給裝置重新命名時,裝置對名字的儲存空間一般都是多少位元組,而並非多少字,並通常都是採用utf-8的編碼。 那問題來了,utf-8的編碼是1-6個位元組的不等長度,如何獲取將一個超過30位元組的文字轉換到30位元組以內? Java中獲取utf-8文字的位元組長度很簡單,如

Android學習筆記 —— Android 開發中,限制 EditText 輸入框不能輸入中文(漢字)

今天在練習開發一個小專案的時候,需要限制 EditText 輸入框不能輸入中文(漢字),在網上找了很多例子,  結合自己的實際,終於完成了這一功能。現在把程式碼記錄下來,方便以後查詢! 首先是xml佈

Android實現限制EditText輸入文字的數量

一: 宣告控制元件。          TextView hasnumTV;         TextView hasnum;// 用來顯示剩餘字數         int num = 50;// 限制的最大字數 二: 主要的方法: hasnumTV = (Tex

android 限制EditText輸入數字的範圍大小

一,要想限制EditText的輸入大小,經過學習和測試;最好是建立自己的EditText(當然是繼承的) public class DecimalEditText extends android.support.v7.widget.AppCompatEditText {

android限制edittext輸入為數字,只允許輸入數字和最多一個.和-

開發遇到的問題 安卓自帶的輸入數字不能輸入.和-,於是自己寫了個。基本夠用了 public void limit(final EditText listValue3){ listValue3.addTextChangedListener(new TextWa

限制EditText輸入中英文Emoji表情字元個數

中文和Emoji表情佔兩個字元,其他的佔一個字元~ 首先先編寫一個過濾器,限制EditText可輸入的最大字元數。 為什麼不用.MaxLeng呢?因為這個屬性的話,中文,英文都算一個字元。所以不符合我們的要求~ public class EditTextFilte

關於如何限制EditText輸入的文字行數為1

今天在學習Android開發,嘗試做一個登入系統。一般常見的登入介面,使用者名稱和密碼這兩欄的輸入是決不允許換行的,而我們使用edittext來獲取使用者名稱和密碼時,控制元件是預設可以換行的,所以我嘗試解決這一問題,首先,想到在xml中配置EditText的屬性時,有意向

android:限制EditText輸入位數

withDrawcet.addTextChangedListener(new TextWatcher() { @Override public voi

Android EditText輸入限制最大字元長度限制只能輸入數字和字母(包含大小寫)

          如題:Android EditText輸入限制最大字元長度  和 限制只能輸入數字和字母(包含大小寫),主要是如下兩個屬性:             android:maxLength="10"             android:digits="0

android中限制EditText最大輸入位元組

需求:使用者只能在輸入框內輸入15個位元組的字元(15個英文字元或5箇中文字元)瞭解:一個英文字元在Android中佔一個位元組,一箇中文字元在Android中佔3個位元組程式碼public class MainActivity extends AppCompatActivi

Android 限制EditText只能輸入數字、限制輸入型別、限制輸入長度的小技巧

準確的說讓Edittext只能輸入數字有方法兩種,都是通過xml屬性設定 方法一: <EditText            android:id="@+id/u_account"            android:layout_width="0dp"

Edittext限制輸入字元長度,解決中英文混用情況保證規定長度

好比知乎中的提問流程,提問內容不應該太長,所以會進行事先設定;最後我使用InputFilter解決了這個問題,程式碼如下。         首先普及一下GB18030編碼標準:GB 18030,全稱:國家標準 GB 18030-2005《資訊科技中文編碼字符集》,是中華人民

Excel如何限制輸入資料長度

平常使用Excel的網友在製作工作表格時會遇到這樣的需求,在製作用來他人填寫資訊的表格中對某些單元格做輸入資料長度限制會帶來很大便利,那麼如何進行設定呢,接下來我將一步步進行說明: 工具/原料 Excel 方法/步驟 第一步,準備資料。首先開啟Excel並新建一

Android EditText限制小數點輸入兩位

限制輸入小數點兩位 需要對輸入框設定鍵盤型別 inputType:number_decimal bank_card_pay_balance.addTextChangedListener(new TextWatcher() { boolean deleteLastChar;//是否需要刪

EditText輸入限制之inputType

//文字型別,多為大寫、小寫和數字符號,(數字符號) android:inputType="none"//輸入普通字元(英語) android:inputType="text"//輸入普通字元(漢字) android:inputType="textCapChar

JavaScript限制textarea輸入長度

<!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http

限制 EditText 最多輸入兩位小數

為了美觀,先限制一下 android:inputType="numberDecimal" android:maxLength="9" 1.要求與思路 細節要求: 以小數點開頭,前面自動加上

EditText限制只能輸入漢字字母和空格

這是第一次使用正則表示式來實現輸入框限制輸入型別,場景是專案中個人資訊模組中的姓名欄位只能要求輸入這些型別,之前只是用其他的方式實現過其他型別的限制輸入,這次想到這個方法邊讓同事幫忙寫了個正則(對於正則我可真是心有餘而力不足)希望能夠幫到大家。。。好了不在這裡扯牛寶寶了,

限制EditText只能輸入中文

MyEditText.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(18)});/** * EditText只能輸入中文 */ InputFilter filte

Android:實現 程式碼控制 EditText 只能輸入固定長度的數字

// 輸入固定長度 editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(