首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

HTML 短信鏈接中文參數亂碼解決:正確編碼與 sms: 協議最佳實踐

     編輯:程式設計疑難解答

問題現象

HTML 頁面構造 sms: 協議鏈接預填短信內容:

<a href="sms:電話號?body=文字">發送短信</a>

點擊後跳轉短信應用,**中文內容變成 %E6%88%91%E6%AD%A3%E5%9C%A8... 這類 URL 編碼字符**,而非可讀文本。

根本原因

  • sms: 協議規定 body 參數**必須 URL 編碼**(RFC 5724)。
  • 瀏覽器/系統會自動對鏈接中的非 ASCII 字符進行編碼傳遞。
  • 短信應用接收後**應自動解碼**,但部分舊版本/定製 ROM 未正確處理,導致顯示原始編碼串。

解決方案

1. 確保頁面編碼聲明正確(基礎)

<meta charset="utf-8" />

2. 手動構造編碼後的鏈接(最可控)

<script>
function createSmsLink(phone, text) {
  var encoded = encodeURIComponent(text); // 關鍵:手動編碼
  return 'sms:' + phone + '?body=' + encoded;
}
// 使用
document.getElementById('send_out').href = createSmsLink('10086', '我正在註冊...');
</script>

優勢:統一編碼行為,不依賴瀏覽器自動處理。

3. 測試不同平台表現

  • Android 7+ / iOS 10+:原生支持 sms: 並自動解碼,通常無問題。
  • 舊版 Android / 定製 ROM:可能不解碼,需考慮替代方案。

替代方案:Web Share API / Intent(更現代)

if (navigator.share) {
  navigator.share({
    title: '分享',
    text: '我正在註冊...'
  }).catch(console.error);
} else {
  // 降級到 sms: 鏈接
}

或 Android 專用 intent: 協議:

intent:#Intent;action=android.intent.action.SENDTO;data=smsto:10086;extra=body%3DI%20am%20registering;end

最佳實踐總結

  1. 頁面強制 <meta charset="utf-8">。
  2. JS 中用 encodeURIComponent() 手動編碼 body 參數。
  3. 提供降級方案(複製文本到剪貼板 + 提示用戶手動粘貼)。
  4. 實機測試覆蓋主流機型,尤其國產定製 ROM。

代碼修正示例

<meta charset="utf-8" />
<a href="sms:10086?body=%E6%88%91%E6%AD%A3%E5%9C%A8%E6%B3%A8%E5%86%8C" 
   class="active_show_btn" id="send_out">發送短信</a>
<script>
// 動態生成更安全
var text = '我正在註冊...';
document.getElementById('send_out').href = 'sms:10086?body=' + encodeURIComponent(text);
</script>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved