Javascript:URL傳值,中文變亂碼
===
###### tags: `javascript`
Coding時因為某些需求要在url後方加上參數傳值,傳送的值又正好是中文,那對方收到的就會變成像"%E4%B8%BB%E7%B7"的亂碼。
這其實是16進位編碼,URL在網路上只能以ASCII碼傳送,而ASCII就只有英、數字及特殊符號,因為沒有支援中文字體,因此將中文以UTF-8轉成16進位編碼。
那現在如果URL要傳中文的值該怎麼辦呢?
解碼就好啦!:smile:
### encodeURI/decodeURI
encodeURI()能夠將中文字串以UTF-8轉成16進位編碼。
相反的,decodeURI()可以將其解碼。
範例:
```javascript
encodeURI("中文");
// "%E4%B8%AD%E6%96%87"
decodeURI("%E4%B8%AD%E6%96%87");
// "中文"
```
### encodeURIComponent/decodeURIComponents
當中文中含有特殊符號時,會發現使用encodeURI/decodeURI無法將其做編碼/解碼,這可能造成後續程式碼誤判為特殊指令而中斷剖析。
:::warning
特殊符號包含 ; / ? : @ & = + $ , #
:::
原因是encodeURI/decodeURI會假定輸入的是完整URI,因此它不會解碼屬於URI語法的字符。
若要連同特殊符號一起編碼/解碼,則必須使用encodeURIComponent/decodeURIComponents。
範例:
```javascript
encodeURIComponent("https://xxx/JS: a_scripting");
// "https://xxx/JS%3A%20a_scripting"
decodeURIComponent("https://xxx/JS%3A%20a_scripting");
// "https://xxx/JS: a_scripting"
/* decodeURI()不會將特殊符號解碼 */
decodeURI("https://xxx/JS%3A%20a_scripting");
// "https://xxx/JS%3A a_scripting"
```
:::danger
要注意!!若使用的話,選取要編碼/解碼的字段丟進去處理就可以了,不可將整個URL丟進去哦!
:::
---
參考文獻:
* [mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI)
* [雲騰訊-解决js url传值中文乱码问题](https://cloud.tencent.com/developer/article/1334325?from=15425&areaSource=102001.1&traceId=5k1VA1ZNnSsHE_WUZNv0N)
* [Javascript: 網址亂碼如何處理](https://acupun.site/lecture/html5_CSS_javascript/7-code02.html)