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 */
}
}