意义不大。因为做事情的方式不对。encoding问题不应该这样解决。
解决方案 »
- js监听点击了那个按钮(知道的进)
- js的操作???
- ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●怎样证明这两个this是一样的?????????????
- 我把JS类实例化后,把一个方法做为event添加给一个DIV,为什么它就不能访问类中的属性了
- 有个小问题,高手进来看看
- 一个小问题,请大家帮帮忙
- 如何把当前日期插入表格中。
- 小问题
- 基于JavaScript的树形菜单(含设计文档和源代码)
- 求大佬解
- 如何使鼠标停留在一个控件上2秒之后显示一个动态信息
- 请各位 修正 一下 "拖动层" 的代码, 主要 是 拖动的时候 "鼠标" 和 "拖动的层" 位置相差很大 !!!! 急!!!!
楼主的实现很有创意,巧妙省去了映射关系中的近一半的字节
我觉得很有意义!
想当然地就认为人家思路不对,其实你却不知楼主这虽看似笨拙的办法却是唯一的出路(前提:只依赖javascript)。或者说说您的高明的思路给我这个菜鸟学习一下!谢谢!
我说的“思路问题”,是指楼主有没有想过,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。优秀程序员与普通程序员的区别就在于后者只会解决问题,而前者会以正确的方式解决问题。
这个例子里面,关键在于这些web服务器端的程序(asp,jsp,etc.)最好不要用gb2312的方式解码,我在csdn和很多地方的讨论java中文问题的地方都反复表达了这个观点。特别是GET方式的(参数编码在url里面的),应该始终以utf-8来解码,这是大量规范(http相关的rfc,w3c html规范等等)已经规定了的。以XmlHttpRequest来说,由于它只能请求本domain的网页,可以认为做js开发的人,应该有能力影响server端的人,所以基本上不存在server无法控制的问题。如果是虚拟主机用户发现虚拟空间的设置有问题(例如始终以错误的编码发送content-type),可以要求webmaster做设置,如果它的服务商不愿意或者不会的话,那就是服务水准或者态度的问题,如果是我的话,我就会换一家。
还有一点你弄错了,GB2312Codec并不是framework的一部分,他与jsvm framework没有关系。只是他的遵循了jsvm的规范而已。jsvm framework并不关心具体的应用!
至于这个帖子的主题,我是这么认为的:这里并没有讨论 gb2312 编码的实用意义,只提出了一种纯js的解决方案!如何用或者不用取决于用户的意愿和具体的应用场景,我们不能武断的加以全盘否定gb2312的意义!当然提出更好字符方案也是没错的。 jsvm 网站是指 jsvm.homolo.com 还是 jsvm.org ?我这两天也感觉有些慢,因为未参与这个网站的开发和设计,所以具体原因我也尚未知!可能目前设置为调试模式或者没有采用lib的优化方式的原因吧!正确使用jsvm 对web的额外负载并不大的!这个已经通过数据验证过!
比如:你支身进了孤岛,想生火,身边却无任何工具可用。这时候我提醒你:可以钻木取火!哈哈
我也说了,我同意在某些情况下,可以做为patch。但是一个要作为正式产品的,就不应该如此。老板喜欢gb2312没有问题。网页当然可以gb2312编码。但是参数提交应该使用utf-8,两者并不矛盾。如果老板进一步连参数的编码问题这样的细节都要插足,那这个项目就离失败不远了。我们不能完全归咎于客观原因,我们有没有自己争取过用正确的方式处理问题呢?比如说“LINUX里用JS读GB2132编码的网页”(不知道在Linux下用JS读是什么意思,你意思是在Linux下用Moz?),其实并不一定需要转码。虽然XMLHttpRequest在读取text文件时,并不会自动调整编码,但是如果你读取的是一个带有encoding声明的xml文件,无论IE或者Moz都会正确的处理编码。所以根本没有必要大动干戈的使用所谓纯JS的转码。可以这样论断,在当前主流的web环境下采用纯js转码根本不是火车和汽车的问题,而是现代交通工具和马车的问题。还有,为什么我们要扮孤胆英雄?我看,绝大多数根本就是假想出来的荒岛。到现在为止,我还没有看到一个实际的web应用例子能说用纯JS转码是合理的方案。还有楼上的,java的编码问题早就解决了,除非你还在用jsp 1.1。
对于各种Java web container(servlet/jsp),只要你的container不是太老掉牙,你都可使用filter来处理encoding,Java具有一切你处理encoding所要的能力,唯一问题是你会不会使用。
不过好像也没有什么可以讨论的,最多写一些faq帮助一下初学者,或者不清楚的人可以去看 rfc 文档,看看规范中是怎么定义的!
var h_offset = (i - l_offset) / 0x5e;
var gbCode = (h_offset + 0xa1).toString(16) + (l_offset + 0xa1).toString(16);这个算法依据的是什么?
尽管你后来发现自己的失误,却不虚心改正,用转移话题的方式掩盖失误。说了一堆编码的话题,仔细看看,你说的那些有什么创新的地方,是不是觉得别人都不懂,只有你自己知道,这未免有些可笑!
算法的依据我在前面的实现原理中已经提到,gb2312 汉字的内码范围:低字节从A1到FE,高字节从B0到F7(我放大范围到:A1-F7),我按这个顺序遍历出所有汉字并得到他的utf8码值。还原的时候根据index得到gb2312内码值,上面这个算法就是还原过程。GB2312Codec 这个类虽然常用在urlencode中,但实际上它是变相得到了汉字的内码,故也可以用在对中文 base64编码,des,md5 加密等算法中。主要是base64和des,md5倒无所谓,反正它不要求可逆(它本身也不可逆),通过别的手段转换一下中文也行。
其实我并不建议这么做,因为md5的算法是公开的。如果你的算法中间加了某种未做约定的其它转换。可能会导致相同的明文你加密后的密文与其他渠道(比如:c或者java)加密的结果不一致。除非这是一个自身封闭的系统,你能保证这种算法的一致性也行。否则还是得先对汉字作内码分解处理。
var h_offset = (i - l_offset) / 0x5e;
var gbCode = (h_offset + 0xa1).toString(16) + (l_offset + 0xa1).toString(16);0x5e怎么来的?0xa1怎么来的?抱歉对编码转换还不是很清楚,不然就解释了,呵呵
我们把汉字的GB2312内码的 低字节作x坐标,高字节作y坐标,那么所有汉字分布在以点 p1(0xa1,0xa1) {注:p1本来是(0xa1,0xb0) 但我做过调整} 和 p2(0xfe,0xf7) 为对角顶点的一块长方形的区域内,0x5e就是这块区域的长度 : 0x5e = 0xfe - 0xa1 + 1
我们开始的时候做了一个转换:把这些点都移到x轴上来,(其中将p1平移到原点)假设点p(x,y)移动后的坐标是 p'(x',y') 其中:x' = x - 0xa1 + 0x5e * (y - 0xa1) 和 y' = 0 。同时我们把对应的汉字的utf8值放到 以 x' 为下标的数组中。
如今,我们有p'点的坐标,要还原成原先p的坐标,则: x = x' % 0x5e, y' = (x' - x) / 0x5e 即是!得到 p点坐标:其实就是汉字的内码了,再找到对应以 x'为下标的数组中的对应utf8值,再根据unescape得到汉字字符,即完成整个汉字与gb2312内码的映射关系!
0x5e = 0xfe - 0xa1 + 1就很清楚了,呵呵,谢谢
gb2312码顺序虽然和uft8码没有一一对应,但是uft8码里明显有很多部分是具有连续性的
比如,
3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,304a,304b,304c,304d,304e,304f
就可以记为3040,15
即当一组有顺序数时,就记下第一个出现的数,和后续连续出现的数字的个数,在还原时依照3040+1,3040+2这样算出来;也就是当一个数是孤立的一个,就把它原样抄下,当一个数后面还出现有连续性的数字,就把它当作一组数记下[第一个数,后续的数的个数]
我想应该会压缩不少空间吧
在这个问题上,时间和空间是矛盾,必须有所取舍,而我们应该在矛盾中找到一个通常情况下的时空兼顾的平衡点。我认为目前就是一个相对平衡的设计。
我个人觉得 40k 并不大,假如是在jsvm2下运行,借助jsvm2自身在内存中的高速缓存,40k的空间大小可以更加忽略。