2013-03-26 18 views
1

<script type="text/javascript" charset="UTF-8">似乎並沒有做的工作:(JavaScript和UTF-8編碼

我會從頂部開始,因爲我在尋找solutiona可能不是一個我所要求的。

所以我在一個簡單的CRM上,它的一個'簡單'功能是註冊一個客戶的請求,該請求還沒有在Customers數據庫中 - 如果CRM無法找到一個名稱與所提供的名稱匹配的客戶,然後新客戶註冊,這個非常受歡迎的功能導致很多Customers實體的所有公稱名稱屬性都是空的

後來用戶確實添加了聯繫人屬性,但工作流程非常緩慢且無聊。爲了加快速度,我編寫了一個python函數,它根據local yellow pages的名稱查找客戶,解析HTML並將其轉換爲dict()。這需要相當長的一段時間,所以我把它放在單獨的查詢頁面上,根據請求這是紅色的JavaScript。

查詢頁面呈現字典作爲像這樣的字符串: [{'name': '"AG \xc4\x80bolti\xc5\x86a b\xc5\xabvuz\xc5\x86\xc4\x93mums", SIA', 'phone': '67244222'}]通知字面UTF-8編碼

$.get('/zl?name=AG SIA ĀBOLTIŅA BŪVUZŅĒMUMS', function(data){... 檢索它上面看起來同樣的方式。將檢索到的dataString轉換爲Object result = eval(data)[0]。因此,現在$('#zl').html(result.name)"AG ÄboltiÅa bÅ«vuzÅÄmums", SIA置爲非「BOLTIŅABŪVUZŅĒMUMS」,因爲它應該是。

我在頁眉中有<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>,腳本以<script type="text/javascript" charset="UTF-8">開頭,但沒有任何幫助。

所以問題:

  1. 如何設置JS輸出的編碼正確?有沒有一些技巧方法,如string.toProperUTF-8()
  2. 有沒有辦法.decode(UTF-8) Python字典不會導致服務器錯誤?
  3. 有沒有問題少的方法來做到這一點?
+1

我認爲'Content-Type' HTTP頭比腳本標籤的'charset'屬性更相關。 – Bergi 2013-03-26 15:02:04

+3

爲什麼不使用JSON呢? JSON是一個清晰的定義標準,包括可接受的編碼,使得實現者可以輕鬆地獲得該部分*正確*。 Python有一個'json'模塊,使您可以輕鬆地使用Unicode數據生成正確的JSON。 – 2013-03-26 15:03:34

+0

@MartijnPieters:看來OP已經使用JSON,只有他無法正確地獲得JSON字符串的編碼。 – Bergi 2013-03-26 15:10:10

回答

2

這不會起作用,因爲JavaScript和Python中有不同的字符轉義語義

如果我得到這個權利,你eval荷蘭國際集團你當它到達把它變成一個對象的JSON你的JavaScript。

請不要這樣做。

取而代之的是,使用python的內置json模塊回覆正確格式化json的請求,然後在您的javascript中使用JSON.parse()來閱讀回覆。這應該確保解析正確發生。

一個簡單的例子,從蟒蛇:

import json 

# lots of code... 

@route("/my_page") 
def my_page(request): 
    return json.dumps({ 
    "siblings":["Eenie", "Meanie", "Meinie", "Mo"], 
    "ages":[1,2,3,4] 
    }) 

# lots more code... 

現在從Javascript調用:

$.getJSON('/my_page', function(data, textStatus, jqXHR) { 
    /* Do stuff with the object */ 
}); 

注意我如何使用jQuery的內置getJSON()獲取對象。您可以使用普通的舊AJAX和JSON.parse()

爲什麼eval()是一個壞主意

使用eval而不是JSON.parse()實際上是打開你的代碼,以大量的安全漏洞。如果惡意用戶(或注意力分散的開發人員)可以在請求中放置JavaScript代碼,則代碼會自由統治您的頁面,這會危及用戶的安全並可能導致一些非常難以發現的錯誤。在任何情況下,生產頁面都不應該使用eval(),特別是當被評估的數據不可信時,就像它來自網絡一樣。在MIME類型

隨機音符

雖然這不會導致在大多數情況下的問題,你應該確保你的Python代碼返回correct mime type for JSON。解決這個問題可能會導致難以調試的奇怪問題。如何做到這一點將取決於你正在使用的Python框架。

+0

我實際上是'eval'ing字符串,因爲我不知道如何讀取JSON對象。你的'JSON.parse()'幫了大忙!謝謝! – 2013-03-26 15:15:52