2010-12-15 28 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值。这是非常罕见的,你经常可以忽略它。