2017-03-13 28 views
0

我建立與Apache科爾多瓦的支持團隊,爲我公司的一切應用程序,我使用UTF8測試數據庫中工作時是好的。PHP的問題人物

後來,當我實現真正的DB我注意到它與雙贏,1252的編碼。

問題是,即使數據庫是win-1252我們有很多行使用特殊的字符,如「ç」和「〜」和「'」和「`」,當我運行php所有行在我的數據庫中的表中不會顯示,因爲這一點。

請記住,我不能將數據庫轉換爲utf8。

PS:我看到的解決方案是去的每一行並刪除caracters,但不是一個好的解決方案(約20000行)

............... .........

PHP文件:

header("Access-Control-Allow-Origin: *"); 

$dbconn = pg_connect("host=localhost dbname=bdgestclientes2 
    user=postgres password=postgres") 
    or die('Could not connect: ' . pg_last_error()); 

$data=array(); 

$q=pg_query($dbconn,"SELECT * FROM clientes WHERE idcliente = 3"); 

$行= pg_fetch_object($ q)){$數據[] = $行};

echo json_encode($ data);

+2

你必須要保存它不支持字符的數據庫。這是你應該解決的問題。是的,有解決方法,不,真正的問題是數據庫不支持您需要它支持的字符。 – deceze

+0

如果你絕對不能更改字符集,你可以做的是在保存時將字符串轉換爲base64,並在加載時將它們轉換回UTF-8 – apokryfos

+0

事情是數據庫用win1252編碼,我有20000行,像2000行,有任何種類的特殊字符。 $ data = array(); $ q = pg_query($ dbconn,「SELECT * from clients where idclient = 3」); ($ row = pg_fetch_object($ q)){ $ data [] = $ row; } echo json_encode($ data); 在此查詢,我與客戶交流3,並在他的名字測試 他有一個「C」,所以如果我運行PHP我不會得到任何結果,但是當我在DB改變「C」爲「C」它顯示所有的行數據。 事情是有任何轉換方法,而我運行查詢? –

回答

1

我只是需要在PHP中添加一行編碼爲Unicode,所以我可以用數據並顯示的方式是

pg_set_client_encoding($dbconn, "UNICODE"); 
0

這應該不是問題。

Windows-1252 「支持ç (代碼點0xE),「_ 」(代碼點0x7E),「' 」(代碼點0x60)和「 ´ 」(代碼點0xB4)。

PostgreSQL會自動將字符轉換爲數據庫編碼。

如果你想存儲做出現在Windows-1252字符,如「 Σ 」你會得到的問題。 在這種情況下,正確的解決方案是使用具有不同編碼的數據庫(UTF8)。

如果你不能做到這一點,你必須存儲字符串作爲二進制對象(數據類型bytea),並在您的應用程序處理的編碼。如果您不需要在數據庫中處理這些功能(例如,使用索引進行不區分大小寫的搜索),那麼這樣做只會很好。

+0

我搜索,我發現了結論,但事情是。如果我在php文件中訪問數據庫並運行查詢(選擇名稱來自客戶端,其中idcliente = 3),並且他的名字是例如「Gonçalves」,則該查詢不會顯示任何結果。但如果我手動去數據庫並將他的名字改爲「Goncalves」,它就可以正常工作,這就是我迷路的原因,爲什麼在這種情況下他不顯示帶「ç」的表格 –

+0

您不顯示任何代碼,所以不可能說。查詢最確定*會*有結果,但是您的PHP代碼可能無法正確處理或顯示它。 –

+0

<?php header(「Access-Control-Allow-Origin:*」); (''無法連接:'。pg_last_error());或者不能連接:'pg_last_error());或者不能連接:'pg_last_error() $ data = array(); $ q = pg_query($ dbconn,「SELECT * from clientes where idcliente = 3」); ($ row = pg_fetch_object($ q)){ $ data [] = $ row; } echo json_encode($ data); ?> 這是我在php文件 –

0

我有一個類似的問題,在這裏我不能修改數據庫設置,但我使用PHP的HTML實體編碼來解決:從本地ヶ輛

我去掉了HTML的關鍵因素,因爲我所見即所得的編輯工作,需要保持這樣的內容。如果你沒有這種限制,你可以在字符串上使用htmlentities。

function makeFriendly($string) 
     $list = get_html_translation_table(HTML_ENTITIES); 
     unset($list['"']); 
     unset($list['\'']); 
     unset($list['<']); 
     unset($list['>']); 
     unset($list['&']); 
     $search = array_keys($list); 
     $replace = array_values($list); 
     $search = array_map('utf8_encode', $search); 
     str_replace($replace, $search, $string); 
} 

如果我需要的實際字符我可以隨時調用的數據庫字符串html_entity_decode得到「真實」的字符串。