2011-03-28 4 views
4

나는 Count characters/sms using jQuery을 발견하지만, 등 중국어, 일본어, 태국어, 국제 문자를 지원하지 않습니다국제 카운트 SMS 문자

다음
var $remaining = $('#remaining'), 
    $messages = $remaining.next(); 

$('#message').keyup(function(){ 
    var chars = this.value.length, 
     messages = Math.ceil(chars/160), 
     remaining = messages * 160 - (chars % (messages * 160) || messages * 160); 

    $remaining.text(remaining + ' characters remaining'); 
    $messages.text(messages + ' message(s)'); 
}); 

잘못된 문자 카운트의 몇 가지 예입니다 :

은請 求 你 吃飯 了 嗎? < < 11 자

สวัสดี คุณ กิน หรือ? < < 17 자

こ ん に ち は, あ な た は 食 べ て い ま す か? < < 18 자

안녕하세요, 당신이 먹는 거죠? < < 17 자

हैलो, आप खाते हैं? < < 18 자

Добры дзень, вы ясьце? < < 22 자

나는 비 ASCII 문자가이 일을 할 수있는 방법

?

+0

대부분의 경우 잘 계산됩니다. '您好, 請問 你 吃飯 了 嗎? '*은 11 자 길이이며, 일본어, 한국어, 러시아어도 괜찮습니다. 예상되는 숫자는 무엇입니까? 태국어와 힌디어 만 가능하지만 캐릭터가 어떻게 계산되는지는 알지 못합니다. – deceze

+0

예, 태국어와 힌두어가 다르다고 말했듯이 ดี는 이미 2 자이므로 위의 jquery와 마찬가지로 국제 중국어, 태국어, 일본어, 한국어, 힌디어, 러시아어를 지원하는 방법을 찾았습니다. – Ironman

+2

예,您 "는 * 하나의 UTF-8 문자 *입니다. 분명히 당신은 문자가 아닌 * 바이트 *를 계산하고 싶습니까? – deceze

답변

9

"문자"는 여기에 포함 할 수 없습니다. Wikipedia의 SMS에 따르면 SMS (7 비트 GSM, 8 비트 GSM 및 UTF-16)에는 세 가지 다른 인코딩 중 하나가 사용됩니다. 먼저 어떤 인코딩을 사용하는지 알거나 결정해야합니다.

항상 UTF-16을 사용한다는 것을 알고 있다면 16-bit code units 문자열 수를 계산할 수 있습니다. 표준 SMS는 70 개의 16 비트 코드 단위로 구성 될 수 있습니다. 그러나 이로 인해 라틴 문자로 된 메시지도 70 개로 제한됩니다. 따라서 라틴 문자의 경우 전체 160 자 (7 비트 인코딩 사용) 또는 140 자 (8 비트 인코딩 사용)를 사용하려는 경우 세 가지 경우를 구분해야합니다. 계수 UTF-16 16 비트 코드 단위

예 : 당신이 이유를 설명해야합니다 있도록 BTW

var message = "您好,請問你吃飯了嗎?"; 

var utf16codeUnits = 0; 

for (var i = 0, len = message.length; i < len; i++) { 
    utf16codeUnits += message.charCodeAt(i) < 0x10000 ? 1 : 2; 
} 

, 당신이 "잘못된"로 게시 한 후 같은 번호를 가지고 올 것입니다 너는 그것들을 부정확하다고 생각한다.


편집 이미 나는 신속하게 제대로 (지금까지 내가 말할 수있는) 함수를 해킹 받아 들여지고에도 불구하고

은 GSM 7 비트 (가능한 경우) 및 UTF-16 크기를 계산 SMS 메시지 : http://jsfiddle.net/puKJb/

+0

'Math.ceil (Math.log (message.charCodeAt (i))/Math.log (2 << bits))'bits는'7'이나'8'입니까? – Gumbo

+1

@Gumbo : 나는 여기에 해당한다고 생각하지 않는다. GSM 7 및 8 비트 인코딩은 유니 코드 코드 포인트 ('charCodeAt'가 반환)를 기반으로하지 않습니다. – RoToRa

+0

I * think * [SMS 표준] (http://www.3gpp.org/ftp/Specs/html-info/23038.htm)은 UTF-16이 아니라 UCS-2를 지정합니다. 따라서 2 바이트 문자 만 가능하며 BMP 외부에는 문자가 없습니다. –