[英]Is jQuery / Backbone mangling my UTF-8 characters?
我正在將網站的前端從舊的YUI2框架遷移到jQuery / BackBone。 PHP / mySQL后端未更改。 一切都很好,只不過通過Backbone save(通過$ .ajax)發送的UTF-8字符變得混亂了,我不知道為什么。
這是我所知道的:
YAHOO.util.Connect.asyncRequest
使用escape(string)
進行escape(string)
,並通過YAHOO.util.Connect.asyncRequest
作為JSON在XMLHttpRequest
傳遞,並且未轉義並以UTF-8 escape(string)
保存在數據庫中,完全可讀且美觀。 <meta charset="UTF-8">
和<meta http-equiv="content-type" content="text/html; charset=UTF-8">
頭。 舊的前端沒有這些設置。 我只提到這是因為兩者有所不同。 <form>
提交時,它們可以正常工作。 Content-Type:application/x-www-form-urlencoded; charset=UTF-8
如何在新的前端傳遞數據?
有時通過常規Backbone model.save(),有時通過以下選項傳遞數據:
var text = $('#input-' + targetId).val(); var atts = {}; atts['target_id'] = targetId; atts['user_id'] = userId; atts['text'] = text; var comment = new Comment(atts); comment.save( {}, { type: 'POST', url: '/api/comment?', data: atts, processData: true, success: function(comment, response){ //success handling }, error: function(model, response){ //error handling }, }, );
那么,這些殘缺不全的特殊字符是什么樣的呢?
在輸入中輸入:テクステクサンテクステクサン
:當我通過完全轉義 ,他們在表單數據部分控制台請求看起來很好text: テクス テクサン テクス テクサン
クステクサン,但在數據庫中錯位ãã¯ã¹ ãã¯ãµã³ ãã¯ã¹ ãã¯ãµã³
。 也許這是一個線索,我不知道。 通過AJAX傳遞時,我總是會轉義用戶輸入的文本。
當我escape(text)
,我在text:%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3%20%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3
收到以下text:%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3%20%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3
テクス%20テクサン%20テクス%20テクサン
。
更好,但是與使用escape(text)
的舊前端不同,它通過%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3%20%u30C6%u30AF%u30B9%20%u30C6%u30AF%u30B5%u30F3
,在控制台中顯示為text: (unable to decode value)
並保存為未轉義為テクステクサンテクステクサン的數據庫
當然,現在是2016年,我們都知道不應該使用escape()
。 我們應該改用encodeURIComponent()
。 因此,當我encodeURIComponent(text)
,這是控制台中顯示的內容: text: %E3%83%86%E3%82%AF%E3%82%B9%20%E3%83%86%E3%82%AF%E3%82%B5%E3%83%B3%20%E3%83%86%E3%82%AF%E3%82%B9%20%E3%83%86%E3%82%AF%E3%82%B5%E3%83%B3
已保存為數據庫中的%E3%83%86%E3%82%AF%E3%82%B9%20%E3%83%86%E3%82%AF%E3%82%B5%E3%83%B3%20%E3%83%86%E3%82%AF%E3%82%B9%20%E3%83%86%E3%82%AF%E3%82%B5%E3%83%B3
技術上講是decodeURIComponent
,並且在顯示此文本時我始終可以decodeURIComponent
,但這確實很痛苦,而且只是掩蓋了問題。
我還嘗試了unescape(encodeURIComponent(text))
,結果如下: text:ãã¯ã¹ ãã¯ãµã³ ãã¯ã¹ ãã¯ãµã³
控制台中的ãÂÂã¯ã¹ ãÂÂã¯ãµã³ ãÂÂã¯ã¹ ãÂÂã¯ãµã³
在數據庫中的ãÂÂã¯ã¹ ãÂÂã¯ãµã³ ãÂÂã¯ã¹ ãÂÂã¯ãµã³
。
似乎正在進行某種形式的雙重編碼,或者后端被構建為處理通過YUI2異步請求傳遞的特定格式。 我不知道。
關於下一步應該嘗試的任何想法? 最佳做法是什么?
既然我已經睡了一個晚上,我已經意識到了一些事情,我想我已經找到了解決方案。
現在很清楚, 舊的前端未正確傳遞數據...這在發送請求時在控制台中顯示了text: (unable to decode value)
。 某種程度上,即使api或db存儲類中沒有解碼,PHP后端也能夠處理傳遞的文本。 這又是一個謎。
這是我為解決此問題所做的工作:
encodeURIComponent(text)
$comment->set_text(urldecode(Request::get('text')));
在PHP后端api中解碼文本$comment->set_text(urldecode(Request::get('text')));
文本以可讀的UTF-8字符形式轉義存儲在數據庫中,我不需要在讀取/顯示上做任何特殊的事情。 我將需要在后端的所有api端點上添加urldecode
,但這聽起來像是一種可靠的方法,所以我認為它已解決。
我想聽聽有關在前端使用encodeURIComponent
並在后端使用urldecode
想法。 這是解決問題的最佳方法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.