2011-03-24 84 views
17

我是HTTP相關事宜的新手。 我的問題是在iOS開發,我想送使用HTTP頭一個字符串,所以我使用:如何使用HTTP標頭髮送非英文unicode字符串?

[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"]; 

接收服務器的Python(谷歌應用程序引擎),在該數據庫保存字符串值模型StringProperty使用:

dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader') 

然而,問題是,當我嘗試發送非英語串喜歡韓國,它是保存在HTTP標頭是這樣的:

Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4"; 

而當它是由谷歌應用程序引擎接收並保存在數據存儲,它的改變是這樣的:

??? ?? 

,如果它不能找到的Unicode值正確的字符。

是沒可能或允許發送使用HTTP頭非英文字符串?

如果我的iOS只使用setHTTPBody,它可以傳輸非英文字符串並保存到App Engine的數據存儲區正常。

[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]]; 

但我只是找不到正確的方式在基於谷歌App Engine的數據存儲

回答

23

是不是可以或不允許使用HTTP標頭髮送非英文字符串?

根據HTTP標準,將非ISO-8859-1字符直接放在HTTP標頭中是不可能的。這給你ASCII(「英文」?)字符加上西歐常用的變音符號。

但是實際上,你甚至不能使用擴展ISO-8859-1字符,因爲服務器和瀏覽器不要做什麼用的標題非ASCII字符也同意。 Safari採用RFC2616,並將高字節視爲ISO-8859-1字符; Mozilla採用UTF-16編碼單元的低字節,這是相似的,但更加奇怪;來自UTF-8的Opera和Chrome解碼; IE使用本地系統代碼頁。

所以在現實中,所有你可以放在一個HTTP頭是簡單的ASCII碼,沒有控制代碼。如果你想要更多的東西,你將不得不提出一種編碼方案(例如UTF-8 + base64)。 RFC2616標準建議RFC2047編碼字作爲標準的編碼形式,但考慮到它們在RFC2047本身允許的定義,沒有任何意義,也沒有任何支持。

+0

你是什麼意思*(...)這是沒有意義的,因爲它們在RFC2047本身允許的定義(...)*? – 2017-10-04 13:34:18

+0

RFC 2047第5部分規定,編碼字可以在RFC 822的「文本」,「註釋」和「短語」去處,但RFC 2616不是RFC 822系列標準,並且沒有符合這些標準的令牌。 (有一個TEXT標記,但它沒有被定義爲相同的。)它明確指出,它們不得以'引用字符串'進入;在RFC 2616中定義了一個非常類似的「帶引號的字符串」標記,這是您在實踐中最希望放置非ASCII字符的地方(因爲Content-Disposition和類似的參數化標題)。 – bobince 2017-10-12 21:16:05

+0

無論如何,從標準的角度來看,現在已經清楚了:RFC 5987提供了在參數化標題中編碼非ASCII的標準方法,RFC 7230建議非傳統標題爲ASCII。 – bobince 2017-10-12 21:25:47

4
Python中的適當形式使用HTTP標頭,像什麼很多API,如Foursquare的DO和保存的字符串來實現相同的目標

可以在HTTP標題中使用ISO 8859-1以外的字符集,但它們必須按照RFC 2047中所述進行編碼。

+0

如果這意味着客戶端,我的iOS應用程序,應該做在RFC 2047編碼的NSString,被設置爲HTTP標頭值之前,你願意爲我提供在哪裏可以找到iOS或Objective-C的源來處理這個任務?看起來很難找到解決方案 – petershine 2011-03-24 17:52:36

+1

不幸的是,RFC2616中的這個處方是虛假的。由於RFC2047編碼字不是基於RFC-822族原子的,因此不能在任何希望在HTTP頭中使用它們的地方。對未來標準的HTTPbis工作已從2047年的引用中刪除。如果你願意的話,你當然可以使用編碼字作爲特定應用程序特定的編碼形式(但是直接的UTF-8 base64可能更容易)。 – bobince 2011-03-24 22:56:46