使用JavaScript修复编码错误的Unicode字符?

时间:2010-07-08 21:11:25

标签: javascript unicode character-encoding

我正在开发一个内容管理系统的网站,该系统在显示任何包含非ASCII字符的文本方面表现不佳。例如,右侧单引号显示在以下网页上(这只是一个示例,而不是来自CMS驱动的网站):

http://www.gregboettcher.com/cmsunicode.html

我无法控制CMS的内部工作方式,但我还是想尝试以某种方式解决这个问题。

我尝试弄乱页面的charset定义,但是将它从UTF-8更改为ANSI或UCS-2只会让它变得更糟。

这是我的主要问题: 是否可以使用JavaScript以某种方式找到编码错误的Unicode字符并使其正确显示?

我在这里抓住稻草。非常感谢任何可以提供帮助的人。


6月12日编辑:

对于所有回复的人,感谢您对一个非常模糊的问题给出一些有用的回答。

我已经对此进行了更多研究,看起来CMS正在将UTF-8写入数据库,但随后从数据库中读取它,期望得到UTF-8以外的东西(即使它然后生成网页上写着“charset = UTF-8”)。

我同意最好尝试通过阻止将非ASCII字符写入数据库来解决此问题,但使用我正在使用的CMS,这不太实用。

我告诉我的主管我们仍然可以使用JavaScript来解决客户端问题,但当我解释它会涉及什么时,他告诉我不要打扰。他似乎满足于理解造成问题的原因,并将错误转发给CMS的制造商。

非常感谢 - 我从中学到了一些关于文本编码和JavaScript的知识。

2 个答案:

答案 0 :(得分:0)

尝试使用此javascript代码:

window.onload = function() {
  var input=document.body.innerHTML; 
  var output = ''; 
  for(i=0; i < input.length; ++i) { 
    code = input.charCodeAt(i); 
    if (code > 256) {
        output += '&#' + code + ';'; 
    } else {
        output += input[i]; 
    }
  }
  document.body.innerHTML=output;
}

它将用数字html实体替换所有非ASCII字符,但我不知道它会起作用。

答案 1 :(得分:0)

根据使用CMS的贡献者数量,老实说,我认为您最安全,最简单的选择可能是尝试枚举所有非法字符并提供您自己的替代品。根据我的经验,列表通常很小 - 四个智能引号,m-dash,省略号,不间断的空间通常是我看到的唯一罪魁祸首。每家公司可能会有所不同(有些公司会经常使用TM,版权和注册,但您会倾向于看到这些字符很多,您只需将它们添加到您的列表中一次)。现在,口音和变音不是问题。

我怀疑问题是由于这些符号的字符编码似乎与用户选择使用的字体绑定而变得稍微困难​​ - 这是我可以解释两个并排坐在一起的用户的唯一方法生成不同扩展字符的相同配置的机器。因此,在网站文本中搜索任何扩展字符,然后手动将它们添加到以UTF-8保存的JavaScript文件中。

示例代码可能如下所示:

strProblemText = "“I’d say, ‘Get’em all…” – Pokemon Master©";
arrExtendedChars = "“”‘’…–©".split('')
arrReplacements = ['"','"',"'","'",'...','-','&copy;'];
for (var i = 0; i < arrExtendedChars.length; i++) {
    strProblemText = strProblemText.replace(new RegExp(arrExtendedChars[i],"ig"),arrReplacements[i])
}
alert(strProblemText);

第二行的语法有点令人头疼,但它基本上将字符串拆分为单个字符数组,它允许您将所有问题字符保存在一行上。我发现它更容易维护。其他人可能略有不同意见。还有一些人还认为我疯了。

正如@Pointy所提到的,最好在文本进入数据库时​​,或者至少在将文本发送到用户页面之前执行此操作,但在文本发送和加载之后执行此操作仍然是一个可行的选择。