2015-02-09 23 views
1

我們在使用Vertica開發我們的PHP應用程序時遇到了一些麻煩。由於圖像勝過千言萬語,讓我們說我們當前的代碼:需要幫助解決Vertica ODBC Windows VS Linux字符集不匹配問題

if(PHP_OS == "Linux") 
    $c = new PDOVertica("Driver=/opt/vertica/lib64/libverticaodbc.so;Server=192.168.1.49;Port=5433;Database=flexgroup;", "user", "password"); 
else 
    $c = new PDOVertica("Driver=Vertica;Server=192.168.1.49;Port=5433;Database=flexgroup;Server_CSet=UTF-8", "user", "password"); 

$sql = "SELECT NoClient, NomClient FROM tblclients ORDER BY NomClient"; 

$stmt = $c -> prepare($sql); 
$stmt -> execute(); 

while($res = $stmt -> fetch(PDO::FETCH_ASSOC)) 
{ 
    echo $res['NomClient']; 
} 

這種簡單的代碼工作,幾乎正確輸出我們的客戶的名稱(如果任何人的好奇,在PDOVertica類是一個自制的我們構建的包裝器可以繞過PDO丟失參數值的錯誤,並調用相應的ODBC函數)。

無論如何,問題都帶有重音字符。爲了將他們輸出正確我們的發展機器,運行Windows,我們必須做到以下幾點

echo utf8_encode($res['NomClient']); 

現在,如果生產和開發環境中工作以同樣的方式,這將不會是一個問題......但當然,他們沒有。在生產中,使用函數utf8_encode garbles字符串,我們反而要做到這一點對相同字符串的正確出來:

echo $res['NomClient']; 

接下來的問題是非常簡單的:有沒有人設法解決這個字符集不匹配?

由於提前,

奧蘇

編輯:在回答sKwa,我的確知道發佈前的UTF-16/UCS-2的事情。但是,我錯誤地認爲UTF-8和UTF-16實際上是兼容的......他們不是。我犯的另一個錯誤是,當我將頁面的字符集更改爲ISO-8859-1時,很驚訝地發現所有的東西都可以正常顯示。原因是ISO-8859-1和UTF-16至少與字母和數字有關(我沒有檢查每個可能的字符,請注意,因爲我確定在某處,兩種編碼都會不同)。

回答

0

在Windows上,您需要使用UTF-16(或UCS-2)而不是UTF-8。林不知道,但我認爲,在Windows上的UTF-16 BOM(取決於MS Windows版本和系統配置)

About Locales

數據庫服務器接收的所有輸入數據預計將在UTF -8,HP Vertica輸出的所有數據都是UTF-8。 ODBC API對Windows系統上的UCS-2中的數據進行操作,通常在Linux系統上對UTF-8進行操作。