服務器是PHP5和HTML charset是latin1(iso-8859-1)。對於常規形式的POST請求,例如,( - )這樣的「特殊」字符沒有問題,例如。雖然我不確定,但它的工作原理。可能是因爲在代碼爲150的瀏覽器中存在一個可表示的字符(這是我在服務器上看到的與ord
相似的文字)。latin1/aicax請求和特殊字符的unicode轉換問題
現在我們的應用程序還通過ajax提供了一些預覽機制:文本發送到服務器,併發送預覽的完整HTML。然而,當通過ajax發送(用GET和POST測試)時,普通字符代碼150 em破折號字符變爲更多:%E2%80%93
。我已經在apache日誌中看到了這一點。
根據我發現的各種來源,例如http://www.tachyonsoft.com/uc0020.htm,這是em破折號的UTF8字節表示,我目前的知識是JavaScript處理Unicode中的所有內容。
但是在我的應用程序中,我需要latin1中的所有內容。簡單地說:就像一個普通的POST請求會給我那個破折號作爲字符代碼150一樣,我也會需要它來表示翻譯的UTF8表示。
這是我失敗了,因爲PHP的服務器上,當我嘗試將其與任何utf8_decode(...)
或iconv('UTF-8', 'iso-8859-1', ...)
但在這兩種情況下,我得到代表這個角色經常?
(和iconv也拋出我的通知解碼:檢測輸入字符串中的非法字符)。
我的目標是找到一個自動化的解決方案,但也許我試圖在這種情況下是überclever?
我發現其他人只是用預定義的輸入/輸出集進行手動替換;但那總會讓我感覺我可以放鬆角色。
敏銳的讀者會注意到,我在理解關於Unicode和字符轉換的全部影響/複雜性方面落後於我,我絕對更願意理解整個事物,然後簡單地手動映射。基於對單字節字符必要性Delands問題
更新:
事實是,我不知道我是否需要它。目前,我有兩種方式將數據傳遞給服務器,並取回:
客戶端處理latin1 - >正常POST請求 - > latin1的服務器上,發回完整的頁面Latin1的字符OK
客戶端latin1 - > ajax請求(get或post) - > latin1轉換爲utf8 - >我嘗試將utf8轉換回latin1 - >將latin1 HTML片段發送給客戶端以顯示內聯 - >特殊字符失敗
第二種方法失敗,因爲從utf8-> latin1轉換沒有像上面描述的那樣使用utf8_decode /圖標工作。
我的最終目標僅僅是呈現用戶輸入的數據預覽。我需要服務器往返的HTML渲染和其他數據評估必須完成。
解決方案
阿蘭的回答是解決方案:latin1
被作爲在後面windows-1252
處理,這也是該用什麼詞(至少是我2007年在這裏)似乎使用時之間複製&粘貼的東西,瀏覽器。
而且有趣的鏈接(從阿蘭維基百科文章)是對HTML 5 Syntax:
8.2.2.2:用戶代理必須至少支持UTF-8和Windows-1252編碼,但可以支持更多。
...
當用戶代理會以其他方式使用在下面表的第一列中給出的編碼要麼轉換內容Unicode字符或轉換Unicode字符爲字節,就必須代替使用同一行第二列單元格中給出的編碼。當一個字節或字節序列由於這種編碼別名而被不同地處理時,據說它被誤解爲兼容性。
...
輸入編碼:ISO-8859-1 - >替換編碼:窗口1252
就是這樣。成功的關鍵是要知道latin1默默地被視爲windows-1252。你搖滾,謝謝。 – mark 2010-05-06 14:08:36