1. 程式人生 > 其它 >js計算簡訊輸入的字元長度

js計算簡訊輸入的字元長度

技術標籤:javascript字串

需求:如圖
在這裡插入圖片描述
預設顯示:0/160個英文字元
開始輸入後:
如果最後一個字元是英文,顯示:已輸入字元個數/剩餘可輸入的英文字元個數
如果最後一個字元是漢字,顯示:已輸入字元個數/剩餘可輸入的漢字字元個數

概念:資料儲存是以“位元組”(Byte)為單位,資料傳輸大多是以“位”(bit,又名“位元”)為單位。

手機簡訊的長度是由編碼決定的,根據國際標準:

如果傳送純英文字元,由於英文ASCII採用 7位編碼,所以1120位的限額可以傳送1120÷7=160個字元;

如果傳送純漢字字元,每條簡訊最多傳送1120位,合(1120÷8=140, 一個位元組佔8位)140位元組的內容,每個漢字佔用2個位元組140/2=70個字元;

一旦傳送的字元中包含中文、日文、韓文等雙位元組字元,不論中文還是西文,不論全形還是半形,都必須採用2個位元組的8位編碼,因此1120÷8÷2=70個字元,即最多傳送70個字元。

簡言之: 一個英文字母(不分大小寫)佔一個位元組的空間,一箇中文漢字佔兩個位元組的空間;

1個漢字=16bit,1個英文字元=7bit;

即:如果全部輸入中文,輸入的字元長度不能超過70個漢字,如果全部輸入英文,輸入的字元長度不能超過160個英文;中英文混合的最大不能超過1120bit(160*7)。

規則:ASCII編碼大致由三部分組成:

1、ASCII 列印字元:數字 32–126 分配給了能在鍵盤上找到的字元

2、ASCII 非列印控制字元:數字 0–31 分配給了控制字元,用於控制像印表機等一些外圍裝置。

3、擴充套件 ASCII 列印字元:擴充套件的 ASCII 字元滿足了對更多字元的需求。擴充套件的 ASCII 包含 ASCII 中已有的 128 個字元,又增加了 128 個字元,總共是 256 個。

ASCII編碼轉換為Unicode編碼十進位為(0~255)之間的數字,漢字轉換為Unicode編碼大於255

<div class="sms-footer" id="smsFooter">
	<div class="sms-input-content com-ilb"
>
<!-- 用div標籤代替input輸入框,才可以使手機軟鍵盤頂起輸入框 --> <div class="sms-input" contenteditable id="sendText" onKeyUp="sendKeyUp(this)"> </div> </div> <div class="sms-send-btn com-ilb"> <div class="sms-btn-send" id="sendEvent" onclick="replySms(this,event)">回覆 </div> </div> </div>
var maxStr = null;

var maxLength = 160 * 7;

var strLength = 0;

var bitsLength = 0;

var useLength = 0;  // 已輸入的字元長度

var remainLength = 160; // 剩餘可輸入的字元長度

var ascii = true;

//	鍵盤彈起執行的函式
function sendKeyUp(e) {
    
    var str = e.innerText;// 獲取字串
    
    var bitsLengthTmp = 0

    strLength = str.length;

    if (strLength > 0) {
       //charCodeAt()返回字串中指定下標字元的Unicode編碼;fromCharCode()將Unicode編碼轉為字元
       //div的輸入框:去掉按backspace鍵全部刪完內容的時候剩下的不可見10(回車)字元
        if ((str.charCodeAt(0) == 10) || (str.charCodeAt(strLength - 1) == 10)) {
            
            strLength--;
            
        }
        
    }
    

    if (0 < strLength <= 160) {

        bitsLengthTmp = calcBitsLength(str);
        
        bitsLength = bitsLengthTmp

        if (bitsLength <= maxLength) {

            useLength = strLength;

            ascii = isASCIILastChar(str);

            if (true == ascii) {

                remainLength = parseInt((maxLength - bitsLength) / 7);

            } else {

                remainLength = parseInt((maxLength - bitsLength) / 16);

            }

        }

    } else {

        bitsLength = 0;

        useLength = 0;

        remainLength = 160;

    }
    

    if ((strLength <= 160) && (bitsLength < maxLength) && (bitsLengthTmp < maxLength)){

        maxStr = e.innerText;

        $("sendText").setAttribute("data-strlen", useLength + "/" + remainLength);

    } else {

        if ((bitsLength == maxLength) && (bitsLengthTmp == maxLength)) {

            maxStr = e.innerText;

        }

        e.innerText = maxStr;

        $("sendText").setAttribute("data-strlen", useLength + "/" + remainLength);
        
    }
    
}
// 計算輸入字串的bit長度
function calcBitsLength(str) {
    
	var count = 0;
    
	var strLength = 0;

	strLength = str.length;

	if ((strLength > 0) && ((str.charCodeAt(strLength - 1) == 10))) {
        
		strLength--;
        
	}

	for (var i = 0; (i < strLength && i < 160); i++) {
        
		if (str.charCodeAt(i) > 255) {
            
			count += 16; /* 漢字: 16 bits */
            
		} else {
            
			count += 7; /* 英文: 7 bits */
            
		}
        
	}

	return count; //返回字串的bit長度
    
}


// 檢測最後一個字元是否為ASCII編碼
function isASCIILastChar(str){
    
	var index = 0;
    
	var strLength = 0;

	strLength = str.length;

	if ((strLength > 0) && (str.charCodeAt(strLength - 1) == 10)) {
        
		strLength--;
        
	}

	if (strLength < 1) {
        
		return true;
        
	}

	if (strLength > 160) {
        
		index = 159;
        
	} else {
        
		index = strLength - 1;
        
	}

	if (str.charCodeAt(index) > 255) {
        
		return false; /* Not ASCII */
        
	} else {
        
		return true; /* ASCII */
        
	}
    
}