2008-12-03 50 views
1

我有一個php腳本訪問MSSQL2005數據庫,從它讀取一些數據併發送郵件結果。PHP,MSSQL2005和Codepages

有兩種一些列名,並在自身領域的特殊字符。

當我通過我的瀏覽器訪問腳本(Web服務器IIS),查詢被正確執行和郵件的內容是正確的(對於我的觀衆)編碼。 但是,當我從控制檯執行php時,查詢失敗(由於列名中的特殊字符)。如果我將查詢中的特殊字符替換爲對chr()和latin-1中的字符代碼的調用,則查詢得到正確執行,但結果也以拉丁-1編碼,因此在郵件中無法正確顯示。 爲什麼PHP/MSSQL驅動程序/ ...在兩種情況下使用不同的編碼?有沒有辦法解決它?

如果你想知道,我需要的控制檯,因爲我想安排使用的SQLAgent腳本(或任務管理器或其他)。

+0

如果您要指定您正在使用的初始編碼(在您的數據庫中),以及在控制檯中未正確顯示但在瀏覽器中顯示的內容的示例,這將有所幫助。 – lpfavreau 2008-12-13 03:24:47

+0

此外,您在控制檯中運行的PHP版本是什麼?你可以通過鍵入「php -v」來找到。 – lpfavreau 2008-12-13 03:26:09

回答

2

根據您在數據庫中有字符的類型,它可能是一個控制檯限制,我猜。如果您在控制檯中鍵入chcp,您將看到什麼是活動代碼頁,其中可能類似CP437也稱爲擴展ASCII。如果你的代碼頁中有字符,比如UTF8,你可能會遇到問題。您可以通過鍵入chcp 65001來切換到UTF8來更改當前的活動代碼頁。

由於並非所有字體都支持擴展字符(右鍵單擊命令提示符窗口的標題,屬性,字體),您可能還需要根據所需字符將默認光柵字體更改爲Lucida Console。如前所述,PHP的unicode支持並不理想,但您可以設法在PHP5中完成一些功能調用utf8_decode。字符編碼的祕訣就是很好地理解當前使用的工具全部什麼是當前使用的工具:數據庫,數據庫連接,PHP變量中的當前字節,輸出到控制檯屏幕,電子郵件的正文編碼,電子郵件客戶端等等......

對於所有有特殊字符的東西,在我們現代的日子裏,經常會推薦像UTF8這樣的東西。確保沿途的所有內容都設置爲UTF8並僅在必要時進行轉換。

1

PHP對非英語世界的不良支持是衆所周知的。我從來沒有使用過基本ASCII領域以外的字符的數據庫,但顯然你已經有了解決辦法,看起來你只需要忍受它。

如果你想採取這一步,你可以: 1.編寫包含了所有的特殊字符及其等價物CHR 2 foreach所查詢的陣列和str_replace函數數組

但如果查詢是硬編碼的,我猜你有什麼好。另外,確保你使用的是最新的PHP,至少4.4.x,總是會有一些修改,但我剔除了4.x.x的發行說明,並且沒有看到任何與你的問題相關的東西。

1

要記住有關PHP字符串的事情是它們是字節流。如果你想獲取正確字符集中的數據(無論你在做什麼),你必須通過某種函數或過濾器明確地完成這些工作。這一切都很低級。

根據您的設置,您可能需要知道數據庫中字符串的內部字符集,但至少您需要知道數據庫發送給PHP的字符集(因爲請記住,PHP它只是一個字節流)。

然後,你必須要知道目標字符集(也可能是指定的,而你也應該是這樣)。例如,假設你正在從數據庫中獲取UTF-8,但希望發送的Latin-1(因此BASE64或q-Printable編碼爲「內容傳輸編碼」):

$send_string = base64_encode(utf8_decode($database_string)); 

中在這種情況下,你必須知道所有的utf-8字符都存在於latin-1字符集中,並且你可能不會真的想要base64(PHP遺憾的是沒有一個好的q-printable編碼函數,雖然好奇,但它解碼),如果你不是在談論utf-8 =>拉丁-1,你會想要甩出mbstring函數。

至於控制檯,你必須知道,當你在特殊字符從控制檯,這可能取決於外殼和/或PHP設置輸入的內容PHP越來越。但請記住,PHP只將字符串理解爲字節字節字節,您應該可以將其解決。