一种安全、简便的UTF-8和GBK编码的数据转换方法

王志勇 发表于 2013年04月16日 09:06

我最近需要混合处理UTF-8和GBK/或GB2312编码。编写UTF-8和GBK编码互相转换的程序是比较麻烦的,昨天无意中发现一个方法,就是借助于JavaScript+iframe框架。例如父框架页的编码可以是GBK,子框架页的编码可以是UTF-8(反之同理),当父框架页和子框架页互相赋值的时候,完全不用转换编码,而不产生乱码。利用这个原理,可以做很多特殊的处理,简化了大量的步骤,在IE和Firefox浏览器下测试成功。

例如在GBK/或GB2312编码模式下,要对相应的UTF-8页的数据进行处理,这时候通过JavaScript+iframe框架就能达意想不到的效果。利用这个原理,也可以把整站的文件批量在UTF-8和GBK/或GB2312编码中互换。但它唯一的缺点是,只能是父框架页和子框架页之间互相赋值,这时必须做一个数据提交的程序,才能转换编码,也就是说,在自动赋值之后,需要鼠标点击一下进行提交才能实现对要写入的数据进行编码转换。这个缺点,可以用JavaScript的submit()函数实现自动提交。以PHP为例,写入数据的编码格式,是取决于<meta>标签里声明的charset。

由于时间的关系,就不做具体的实例了,因为做一个具体的实例要花费很多的时间,重要的步骤一是使用iframe标签嵌入一个子框架页,子框架页的编码与父框架页的编码不同。重要的步骤二是必须掌握父框架页和子框架页互相赋值的方法,子框架页给父框架页赋值的方法比较简单,就是top.***.innerHTML,或者是top.***.value,方法和在同一页赋值的方法一样,只是多了一个top加点儿。

相反的,父框架页给子框架页赋值,就复杂很多,昨天测试了一下午才成功。父框架页给子框架页赋值,写直接赋值的命名语句不给赋值,必须建立自定义函数才能赋值。网上几乎没有这个直接赋值的方法,我找了很久都没找到,网上的方法是需要通过鼠标点击触发事件,才能赋值,可以在Google或百度搜索“iframe 赋值”。我把它改成<body onload=abc();>,最后完美地成功了。这个abc()自定义函数为:function abc(){document.frames['aac'].document.all.da.value="赋值";}。说明:这里的aac代表的是iframe里的name=。后面的document.all.da.value,其中da是子框架页里一个表单框的名字,这里必须写为document.all.da.value,document.all不能省略,否则不给赋值。如果子框架页里的表单da所在的form有名称,例如<form method=post name=ag>,那么这个abc()也可以写为:function abc(){document.frames['aac'].ag.da.value="赋值";}。

本文是提供一种重要的方法,2个重要的步骤,希望读者能够熟练掌握这个方法。要熟练掌握,可能至少要花一天时间做测试。这个方法,在大型或者小型的程序里,在必要的时候能够发挥重要的作用。特别是在一个混合编码的网站,这是一种极好的方法。没有更具体的代码了,上述的步骤已经写得很清楚了。当然,如果万一出现赋值时出现乱码,就可以通过复制、粘贴、提交来转换编码。例如百度的网站,就是成功地使用UTF-8和GBK两种编码,而没有产生乱码。

我在前面的文章写过,中文如果使用GB2312或GBK编码,可以节省很多字节。而英文的编码,无论是UTF-8还是GBK,字节数量都是一样的,韩文则必须使用UTF-8编码。这是因为,在UTF-8编码下,中文汉字、英文字母、韩文单字所占的字节分别为:3、1、3;在GB2312或编码GBK下,中文汉字、英文字母、韩文单字所占的字节分别为:2、1、8。在GB2312或编码GBK下,文本格式为ANSI,ANSI文件格式无法保存韩文或全角的Unicode码,字符会被转化成&#54620;&#44397;&#50612;的形式(한국어)。

0条评论:

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (44周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2024 auiou.com All rights reserved.
此Blog程序由王志勇编写