WebService,想必大家都比較熟悉,是由“服務提供者”向“服務調用方”提供服務的一種方式。裡面有幾項關鍵的技術:
XML:描述資料的標準方法
SOAP:簡易物件存取通訊協定 (SOAP),用於資訊交換
WSDL:Web服務描述語言
UDDI:通用描述、發現與整合,它是一種獨立於平台的,基於XML語言的用於在互連網上描述商務的協議。
SOAP預設傳輸的都是UTF-8的編碼,這也決定了預設情況下WebService用的也是UTF-8編碼。
現在維護的那個項目是一個PHP項目,編碼用的全是GBK,在調用自身提供的WebService方法時,就會遇到編碼問題了。PHP頁面調用WebService,而這個WebService又調用的是另一個調用COM組件的PHP類。大概情境就是這樣。 複製代碼 代碼如下:PHP頁面(GBK) -> WebService(UTF-8) -> PHP類(GBK)
在未遇到問題之前,一切都是風平浪靜的,就這樣過了很多年。有一天,公司收購了其它公司,為了整合服務,使用者資訊也整合到一起了,原公司所有使用者的帳戶都是由英文字元加數字組成的,而收購的這個公司沒有做這樣的限定,帳戶有漢字的情況。整合之後,問題出現了,“error in msg parsing: XML error parsing SOAP payload on line 1: Invalid character [detail]”!
PHP剛接觸不久,不是甚熟,而且NetBeans的調試灰常不好整。所以就開啟VS,引用WebService,開始測試。返回的結果,找不到使用者,而且是亂碼,OK,看了一下之後,由於WebService的UTF-8編碼傳給PHP類時,編碼不一致所導致!轉換為GBK再傳過去,收到資料後,找到使用者,但還是亂碼。將返回過來的資料再次轉換為UTF-8之後,一切OK!VS下測試一切正常!上測試機!開始測試!開啟之後,亂碼!仍然是“error in msg parsing: XML error parsing SOAP payload on line 1: Invalid character [detail]”囧!
靜下心來,繼續分析!應該是PHP頁面調用WebService時所導致!VS下面的那個測試頁面是UTF-8的,他們之間沒有問題,但PHP的這個頁面是GBK的。再次修改後,一切又恢複平靜了。 複製代碼 代碼如下:調用:PHP頁面,參數轉換為UTF-8 -> WebService,轉換為GBK後 -> PHP類
返回:PHP類 -> WebService,收到後轉化為UTF-8 -> PHP頁面,轉換為GBK