情況:我正在開發一個通過odbc接口連接到mssql數據庫的PHP腳本。匹配收集的數據後,這些數據通過REST接口傳輸到外部服務器。該腳本在Windows客戶端上運行。到目前爲止,一切正常。除了處理urlencode結果的編碼之外,還有其他因素嗎?
問題:在我發送數據之前,我使用函數urlencode()
來轉換德語特殊字符,如ö,ä,ü和ß。出於某種原因,這對於從數據庫中讀出的數據不起作用。以下工作正常:
echo urlencode("Münzener");
等於:「M%C3%BCnzener」,這是正確的。
現在我想要的結果從數據庫編碼:
$connection_string = "DRIVER={SQL Server};SERVER=".LOCAL_HOST.";DATABASE=".LOCAL_DATABASE;
$conn = odbc_connect($connection_string, LOCAL_USER, LOCAL_PASSWORD);
$sqlH = odbc_exec($conn, "SELECT field FROM table; ");
while($row = odbc_fetch_array($sqlH)) {
/* var_dump($row["field"]) equals string(8) "Münzener"*/
echo urlencode($row["field"]);
}
等於: 「M%81nzener」,這是不正確的。
我知道在處理類似問題的計算器上有很多主題。因此,我嘗試了以下內容:
1)檢測字符集並將其轉換爲UTF-8。結果:mb_detect_encoding()
說,我有ASCII。 iconv('ASCII', 'UTF-8', $string);
回報PHP的通知:
的iconv():檢測到輸入字符串非法字符
如果添加UTF-8 //忽略字符缺失。 UTF-8 // translit返回不同的字符。 mb_convert_encoding()
的行爲方式相同。
2)函數utf8_encode()
將字符串轉換爲「M%C2%81nzener」,這是不正確的。 「%C2%81」看起來更好,但它不是「%C3%BC」,這是正確的。
3)我嘗試通過odbc_connect()
方法的字符集。沒有什麼變化。去年我有一個與csv文件幾乎相同的問題。所以我不認爲這是問題。
所以我的主要問題是:在這種情況下編碼有什麼問題?除urlencode()
之外的編碼還有其他問題嗎?
1)閱讀'mb_detect_encoding()'和'utf8_encode()'手冊頁,你會意識到他們不會做你認爲他們會按名稱判斷的事情2)我沒有理由懷疑任何奇怪的東西:如果'urlencode()'產生不同的輸出結果,你就用不同的輸入來輸入它。我敢打賭,你還沒有決定你的應用程序的字符集,你只是在各地使用默認值。 –
'echo bin2hex($ row ['field'])' - 這是什麼給你的? - 簡而言之:您的odbc連接不會像您期望的那樣使用相同的編碼返回數據,它可能會以某種ANSI代碼頁的某種奇怪的專業編碼形式返回。 ASCII中的'iconv'不起作用,因爲ASCII不包含字母ü。無論如何,檢測編碼是不可靠的,所以不要關注它。 'utf8_encode'只適用於Latin-1,顯然odbc不會返回。 – deceze
它給出了最初代表「Thomas-Müntzer-S」的字符串(32)「54686f6d61732d4d816e747a65722d53」。現在我明白了爲什麼這不起作用。所以 我唯一的機會是改變連接的編碼? –