本文以韓文文字為準。韓國的簡訊在 90 位元組以內是短訊(SMS),超過就成為長訊(LMS)。「90 位元組」常聽到,但實際換算成韓文字要放幾個,算起來其實容易搞混。韓文字每個佔 2 位元組,英文字母、數字、空格只佔 1 位元組,混在一起就能放更多,而且只要夾進一個表情符號,算法又會不一樣。以下依 Geuljasu 位元組計算工具採用的標準,整理計算方式與實際算出的數值。
90 位元組怎麼算
位元組數取決於文字用哪種字元編碼儲存。韓國簡訊常用的標準是 EUC-KR,與網頁使用的 UTF-8 相比,一個韓文字的大小不同。
| 文字種類 | EUC-KR(近似) | UTF-8 |
|---|---|---|
| 英文字母、數字、空格、基本符號 | 1 位元組 | 1 位元組 |
| 一個韓文字 | 2 位元組 | 3 位元組 |
| 漢字、假名、表情符號等 | 2 位元組(近似) | 依字元而異(表情符號約 4 位元組) |
Geuljasu 把英文字母與數字算 1 位元組、其他字元算 2 位元組,將這個值顯示為「EUC-KR 近似」;此值在 90 以內為短訊,2,000 以內為長訊。EUC-KR 無法表示的字元(例如表情符號)同樣算 2 位元組。因為是近似值,實際標準請再向電信業者或發送業者確認。
同樣是 90 位元組,字數差很多
45 個韓文字在 EUC-KR 剛好是 90 位元組,到第 46 個字就成了 92 位元組,會變成長訊。只用英文與數字寫滿 90 字,剛好是 90 位元組。同樣的 90 位元組,依用字不同,可放 30 字到 90 字。如果只記住「45 字以內」,遇到夾雜數字的實際文案就會算錯。
用實際文案計算
以下是用 Geuljasu 計算函式算出的數值。韓文文案為實際輸入的原文,括號內是中文意思。
| 文案 | 字數 | EUC-KR 近似 | UTF-8 | 類型 |
|---|---|---|---|---|
| [배송] 주문하신 상품이 오늘 출고되었습니다. 운송장 1234567890 (您訂購的商品今天已出貨,附運單號碼) | 40 字 | 61 位元組 | 82 位元組 | 短訊 |
| Your verification code is 482915. Valid for 3 minutes. | 54 字 | 54 位元組 | 54 位元組 | 短訊 |
| [글자수닷컴] 안녕하세요, 예약하신 상담이 내일 오후 3시로 확정되었습니다. 방문 전 연락 부탁드립니다. (您預約的諮詢已確定在明天下午 3 點,來訪前請先聯絡) | 58 字 | 99 位元組 | 140 位元組 | 長訊 |
第三則通知只有 58 字,但是 99 位元組,超出 9 位元組,所以成為長訊。把這則文案截在 90 位元組,會留下到「…방문 전 연락 부탁」(相當於「來訪前請聯絡」的部分)為止的 53 字,這是以不在字的中間截斷的方式算出的結果。只加一個表情符號也會不同:韓文問候語「안녕하세요 😀」是 7 個字,EUC-KR 近似為 13 位元組。
短訊與長訊怎麼區分
從 91 位元組起就是長訊,工具把 2,000 位元組以內視為長訊。如果只有韓文字,大約是 1,000 字上下。許多服務的短訊與長訊收費不同,所以建議先看看稍微刪減一點能否降到 90 位元組以內。
自己確認的程式碼
貼到瀏覽器的主控台,就能立刻看到文案的位元組數與類型。規則與 Geuljasu 位元組計算工具相同,都是近似算法。
// EUC-KR 近似:ASCII 算 1 位元組,其餘算 2 位元組
function smsBytes(text) {
let eucKr = 0;
for (const ch of text) eucKr += ch.codePointAt(0) < 0x80 ? 1 : 2;
const utf8 = new TextEncoder().encode(text).length;
return { eucKr, utf8, kind: eucKr <= 90 ? '短訊' : eucKr <= 2000 ? '長訊' : '超出' };
}
smsBytes('[배송] 주문하신 상품이 오늘 출고되었습니다. 운송장 1234567890');
刪減時要確認的事
- 空格與換行也算位元組。 一個換行算 1 位元組,所以分很多行的文案會比想像中更快滿。
- 括號、方括號、句點是 1 位元組,但全形符號(如「」、※ 等)算 2 位元組。
- 發送服務自動加入的文字(廣告標示、拒收說明)可能另外加上,因此剛好湊到 90 位元組可能會超出。請預留幾個位元組的餘裕。
- 盡量避免表情符號。 即使在近似計算中也是 2 位元組,實際發送規格則可能依裝置與服務而不同。