2010-12-15 35 views
0

我們有一個使用ISO-8859-1字符集的web應用程序。 Occationaly用戶有'奇怪'的名字,其中包含Š(這裏爲了方便起見編碼)的字符。 我們將此存儲在我們的數據庫中,但是我們無法正確顯示。HTML編碼字符不在字符集中

處理這個問題的最好方法是什麼?我想我應該自動地將字符集之外的字符與其HTML實體編號(Š到Š

但我有問題發現如何自動執行此操作(不使用所有值的表) 。

此代碼適用於擴展ASCII字符,如'å'(存在於ISO-8859-1中)。我想對其他角色也這樣做。我可以使用這些HTML實體編碼值中是否有模式?

unsigned int c; 
for(int i=0; i < html.GetLength(); i++) 
{ 
    c = html[i]; 
    if(c > 255 || c < 0) 
    { 
     CString orig = CString(html[i]); 
     CString encoded = "&#"; 
     encoded += CTool::String((byte)c); 
     encoded += ";"; 
     html.Replace(orig, encoded); 
    } 
} 

回答

1

該網頁應該指示瀏覽器顯示以UTF-8的響應。這通常是通過在Content-Type響應標題如text/html;charset=UTF-8中提供字符集來實現的。

Response.AppendHeader("Content-Type", "text/html;charset=UTF-8"); 

的HTML/XML實體是完全沒有,這樣你就能夠保存比UTF-8編碼的網頁源。

+0

是的,這有效,但我相信我們運行ISO-8859-1的原因。儘管如此,我希望不會,但我會檢查那些應該知道的人。在我們所有的服務器上改變字符集是一項風險很大的操作,儘管我想這樣做,而不是編寫一個不適合的解決方法。 – Polymorphix 2010-12-15 16:08:03

+1

只要你已經在7位ASCII範圍之外使用HTML實體作爲「特殊字符」,它就沒有風險。 ISO-8859-1和UTF-8具有完全相同的ASCII字符的字節表示形式。 – BalusC 2010-12-15 16:19:16

0

html似乎是一個「Unicode」CString。這意味着它是UTF-16編碼。 「& #ddd」語法使用Unicode代碼點編號。通常這很簡單。 Š是U + 0160,這意味着它是UTF-16中的0x0160。 Tha當然是352小數,所以你得到&#352

當您遇到超過U + FFFF的基本多語言平面(BMP)以外的字符時,您只有一個問題。這不再適合16位,因此將在您的html字符串中佔用兩個字符。然而,它應該只產生一個&#ddddd值。這是非常罕見的,你經常可以忽略它。