对于一个“纯JS实现GB2312转码”的看法

原创 2006年02月24日 12:07:00

完整贴在 http://community.csdn.net/Expert/TopicView3.asp?id=4563329

此处把我的论点集中一下:

编码问题不应该这样解决。楼主的出发点是好的,但是解决问题的思路有问题,这个东西充其量就是一个在某些特定条件下的patch。

我说的“思路问题”,是指楼主有没有想过,encoding实际上是一种底层的(相对你开发的application本身来说)设施。

你用到encoding仅仅是在通讯中,如流的io。对于b/s来说,基本上就是browser和server的通讯,极少数应用可能涉及本地文件系统的读写(但是这样的话通常会使用ActiveX或者XPCOM,就更不必用js来做转码了)。本质上,好的设计必然需要把这一部分细节包装起来。

事实上,encoding的处理,在正常环境下,这应该是由浏览器和服务器完成的任务。而且这些都有技术规范或约定。例如服务器发送content-type头中指定encoding。

正确的思路应该是学会怎样正确的利用浏览器和服务器的设施,而不是自己去造轮子。你的轮子运行在系统体系的错误的层次,而且转动也不流畅(性能问题)。只有在极少数的情况下(如某些浏览器的bug,或者你没有办法去修改服务器的错误设置),你的代码可以作为一种临时性的patch。

关于encoding问题,已经确立的最佳实践就是,尽可能全部使用utf-8编码(如html,xml,js,css...)。基本上现代浏览器都能识别带有BOM的utf-8。

这个东西如果作为framework的一部分来说,还是有一点意思的。framework和一般的app开发有些不同,提供这样的功能也不错。不过我是建议在文档中写清楚,对于大多数情况,不应推荐使用该功能。不能因为framework有一种patch的能力,就惯坏了所有用framework的程序员,让他们失去了学习“正确方式”的机会。

例如,“因为很多web服务器在处理请求,反编码的时候都是采用gb2312的方式。”
这个例子里面,关键在于这些web服务器端的程序(asp,jsp,etc.)最好不要用gb2312的方式解码,我在csdn和很多地方的讨论java中文问题的地方都反复表达了这个观点。特别是GET方式的(参数编码在url里面的),应该始终以utf-8来解码,这是大量规范(http相关的rfc, w3c html规范等等)已经规定了的。以XmlHttpRequest来说,由于它只能请求本domain的网页,可以认为做js开发的人,应该有能力影响 server端的人,所以基本上不存在server无法控制的问题。如果是虚拟主机用户发现虚拟空间的设置有问题(例如始终以错误的编码发送 content-type),可以要求webmaster做设置,如果它的服务商不愿意或者不会的话,那就是服务水准或者态度的问题,如果是我的话,我就会换一家。

开发难道不是根据具体的环境和情况来讨论的吗?对于可以得到更高权限的Intranet或本地应用,IE下可以用ActiveX,Moz可以用 XPCOM,都可以调用性能更高的编码模块。对于一般WebApp,应该始终遵循各种规范,例如提交URL参数应该始终使用UTF-8,这才是正途。我们有太多程序员老是用各种hack,而不是仔细看看到底这个工作应该在整个体系的哪一部分完成。

单纯作一个js下的gb2312codec,它是完成了一定的功能,我认为作为framework的一个备用工具还是不错的,但是采用其来作为通用的跨浏览器解决方案显然是不妥的,就好像在城市的公路上骑马出行,没错,可以到达目的地,但是能作为城市的通用交通工具吗?

同样是字符处理,做一个完整的汉字和拼音索引,对于高交互的webapp开发来说,如果能增加这方面的库,其意义比gb2312codec要大得多!

网页当然可以gb2312 编码。但是参数提交应该使用utf-8,两者并不矛盾。

我们不能完全归咎于客观原因,我们有没有自己争取过用正确的方式处理问题呢?其实并不一定需要转码。

虽然XMLHttpRequest在读取text文件时,并不会自动调整编码,但是如果你读取的是一个带有encoding声明的xml文件,无论IE或者 Moz都会正确的处理编码。所以根本没有必要大动干戈的使用所谓纯JS的转码。到现在为止,我还没有看到一个实际的web应用例子能说用纯JS转码是合理的方案。

最后补充一点,解决encoding问题的最好方法是服务器发送正确的Content-Type。这是多份规范所规定的,即服务器发送的Content- Type对决定User-Agent应采取的character encoding具有最高的优先级。而IE、Moz、Opera都是基本遵循这个规范的(无论是网页还是XMLHttpRequest)。

如果情况确实需要处理多种编码,那么最佳实践是:只要开发者有机会影响到server配置,就不要放弃使用这一最简单直接高效的方式来解决问题!例如,即使你是virtual host用户,而你的服务商既蠢又态度蛮横,使得你无法去改正错误的全局配置,但是你还可能有机会使用.htaccess的方式在局部作修正(事实上由于你的服务商很蠢,所以他做出错误配置的机率反而小,并且其服务器保持默认设置即允许使用.htaccess的机会是很大地)。

对于最常用的Apache 2而言,AddCharset指令甚至可以做的更好。使用该指令可以为特定后缀名的文件自动选择字符集编码。而且,令人高兴的是,在绝大多数安装版本的默认配置下,abc.gb.html就会发送gb2312作为编码,一切就都ok了。你所要做的只是规范一下文件命名。注意:Apache的默认配置使用 Content-Negotiation,你甚至只要访问abc就会自动为中文用户选择abc.gb.html的内容发送过去。
对于各种Java web container(servlet/jsp),只要你的container不是太老掉牙,你都可使用filter来处理encoding,Java具有一切你处理encoding所要的能力,唯一问题是你会不会使用。

Javascript 实现gb2312和utf8编码的互换

转载地址 function getCodeStr(){  return codestr; }   function gb2utf(gbStr){  var codeStr = getC...
  • andrew57
  • andrew57
  • 2014年12月08日 11:53
  • 9939

解决gb2312页面调用utf-8页面的js,显示乱码!

这几天一直在为我的网站改版,这次改动很大,可以说是重新做一套很完整的网站了,工作量很大,还要开发出来很多创新的东西来,大年初一我还在家里日夜不停的写着代码。这种学习精神现在已经很少见了。中间遇到很多没...
  • sgear
  • sgear
  • 2008年01月14日 14:32
  • 5587

js gb2312编码

  • 2010年03月02日 12:56
  • 35KB
  • 下载

js gb2312和utf-8相互转换

无标题文档
  • tengyang11
  • tengyang11
  • 2011年02月16日 16:19
  • 7375

用JavaScript实现的将GB2312转换为UTF-8编码

function gb2utf8(data){    var glbEncode = [];    gb2utf8_data = data;    execScript("gb2utf8_data =...
  • hb_cattle
  • hb_cattle
  • 2007年03月24日 20:12
  • 1654

关于js中用base64编码处理中文的问题

之前在网上找了一个js版用base64编码在方法,发现不能处理中文,今天有幸找了一篇专门介绍js中用base64编码的文章,不仅讲解了原理,又给出了实现方法,写的比较好,收藏了。 原文地址--   ...
  • yweijie2008
  • yweijie2008
  • 2017年01月13日 18:11
  • 1385

对于一个“纯JS实现GB2312转码”的看法

完整贴在 http://community.csdn.net/Expert/TopicView3.asp?id=4563329此处把我的论点集中一下:编码问题不应该这样解决。楼主的出发点是好的,但是解...
  • hax
  • hax
  • 2006年02月24日 12:07
  • 7022

JS GB2312转UTF8 支持中英文混合

  • 2007年07月06日 12:05
  • 1KB
  • 下载

utf8转码gb2312的工具

今天写一个开头,明天再上传相关的
  • sunbingzibo
  • sunbingzibo
  • 2014年10月10日 16:44
  • 2395

关于大学考试的一点看法

最近学了两门课,叫做计算机网络和编译原理有个老师使用的是英文课件,非常蹩脚,但他又说中文,英文不好的我看不懂课件,所以我感到非常的别扭 编译原理主要是课程太抽象,并且老师没有布置习题,所以会显得特别...
  • qq_23100787
  • qq_23100787
  • 2015年10月20日 01:55
  • 371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对于一个“纯JS实现GB2312转码”的看法
举报原因:
原因补充:

(最多只允许输入30个字)