2011-12-29 75 views
6

快速背景:我繼承了一個包含英文和阿拉伯文字組合的大型SQL轉儲文件,並且(我認爲)它最初是使用'latin1'導出的。在導入文件之前,我將所有出現的'latin1'更改爲'utf8'。在阿拉伯文本沒有在phpMyAdmin正確顯示(我的猜測是正常的),但是當我加載的文本到網頁具有以下...阿拉伯字符編碼問題:UTF-8與Windows-1256

<meta http-equiv='Content-Type' content='text/html; charset=windows-1256'/> 

......一切都顯得好,阿拉伯文顯示完美。


問題:我的客戶是真的真的很挑剔,不希望改變自己......

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 

...到 'Windows的1256' 等同。我不認爲這會是一個問題,但是當我將charset值更改爲'UTF-8'時,所有阿拉伯字符都顯示爲帶有問號的菱形。不應該UTF-8正確顯示阿拉伯文字嗎?


以下是有關我的數據庫配置的幾點注意事項:

  • 數據庫字符集是「UTF-8」
  • 數據庫連接校對是「utf8_general_ci」
  • 所有數據庫,表,適用領域有被整理爲'utf8_general_ci'

我一直在淘金堆棧溢出和其他論壇的任何有關的事情對我的問題。我發現了類似的問題,但不是解決方案似乎適用於我的具體情況。希望有人能幫助!

+0

使用記事本保存了嗎?如果是這樣的話,確保你選擇UTF-8作爲編碼而不是ANSI,否則你可能會失去你的阿拉伯字符。 – SiN 2011-12-29 22:22:23

回答

2

如果您沒有向我們展示您的代碼,我們無法在您的代碼中找到該錯誤,所以我們在如何幫助您的方面非常有限。

您告訴瀏覽器將文檔解釋爲UTF-8而不是Windows-1256,但是您是否實際上將從Windows-1256使用的編碼更改爲UTF-8?

例如,

$ cat a.pl 
use strict; 
use warnings; 
use feature qw(say); 
use charnames ':full'; 

my $enc = $ARGV[0] or die; 
binmode STDOUT, ":encoding($enc)"; 

print <<"__EOI__"; 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=$enc"> 
<title>Foo!</title> 
</head> 
<body dir="rtl"> 
\N{ARABIC LETTER ALEF}\N{ARABIC LETTER LAM}\N{ARABIC LETTER AIN}\N{ARABIC LETTER REH}\N{ARABIC LETTER BEH}\N{ARABIC LETTER YEH}\N{ARABIC LETTER TEH MARBUTA} 
</body> 
</html> 
__EOI__ 

$ perl a.pl UTF-8 > utf8.html 

$ perl a.pl Windows-1256 > cp1256.html 
+0

糟糕,我認爲這是一個Perl問題。即使這個例子在Perl中也適用。使用的編碼必須與指定的編碼匹配。 – ikegami 2011-12-29 23:24:39

3

如果申報時,如窗戶-1256編碼,那麼它極有可能是編碼窗口-1256的文檔看起來正確的。所以它顯然不會使用latin1輸出 - 這是不可能的,因爲latin1沒有阿拉伯字母。

如果這只是一個文件,那麼最簡單的方法是使用例如windows-1256編碼將其轉換爲utf-8編碼。 Notepad++。 (打開其中的文件,通過文件格式菜單將編碼更改爲阿拉伯文,windows-1256,然後在文件格式菜單中選擇轉換爲UTF-8,然後執行文件→保存。)

Windows-1256和UTF-8是完全不同的編碼,因此,如果將Windows-1256數據聲明爲UTF-8,則數據會全部混亂,反之亦然。只有ASCII字符(例如英文字母)在這兩種編碼中具有相同的表示形式。

2

我認爲你需要回到原點。這聽起來像是你在Win-1256編碼中有一個數據庫轉儲,並且你現在想用UTF-8處理它。這聽起來像是你在使用PHP,但是你的問題有很多不相關的標籤,並且缺少最重要的標籤,PHP。

首先,您需要將文本轉儲轉換爲UTF-8,您應該可以使用PHP來完成此操作。機會是你的轉換腳本將有兩個步驟,首先讀取Win-1256字節並將它們解碼爲內部Unicode文本字符串,然後將Unicode文本字符串編碼爲UTF-8字節以輸出到新的文本文件。

完成之後,重新執行數據庫導入過程,但現在您已將輸入數據正確編碼爲UTF-8。

之後,它應該像讀取數據庫和使用正確的UTF-8編碼呈現網頁一樣簡單。

P.S.實際上,每次顯示數據時都可以重新編碼數據,但這並不能解決數據庫中存儲的編碼數據不正確的問題。

0

序,以正確顯示阿拉伯字符,你需要你的PHP文件轉換爲UTF-8 無BOM 這件事發生在我身邊,阿拉伯字符被顯示鑽石,但轉換爲UTF-8無BOM會解決這個問題