You are here

UTF-8和GBK之间的转换

g089h515r806 的头像
Submitted by g089h515r806 on 星期五, 2009-01-02 10:08

支付宝给出来的示例代码,里面采用的是GBK编码,使用Zend Studio打开以后中文全是乱码.我先是用写字板打开,然后拷贝到记事本中,然后再拷贝到Zend Studio中,这样就实现了将原有代码拷贝过来.

我是直接使用的原有代码,包括各种函数,都是示例代码中所给的,所以遇到的第一个问题就是乱码问题.我仔细的都了源码,按照计算机执行的顺序,一步步往下读,发现了一个问题:

function charset_encode($input,$_output_charset ,$_input_charset ="GBK" ) {

              $output = "";

              if(!isset($_output_charset) )$_output_charset  = $this->parameter['_input_charset '];

              if($_input_charset == $_output_charset || $input ==null) {

                     $output = $input;

              } elseif (function_exists("mb_convert_encoding")){

                     $output = mb_convert_encoding($input,$_output_charset,$_input_charset);

              } elseif(function_exists("iconv")) {

                     $output = iconv($_input_charset,$_output_charset,$input);

              } else die("sorry, you have no libs support for charset change.");

              return $output;

       }

就是这个函数,找到它以后,在最后一句设置了一个断点,使用Zend Studio进行debug,在这里我发现了,我从drupal中读取出来的字符串,经过这个函数处理以后,就变成了乱码了。

这个发现虽然很小,但是找到了问题的所在。我把整个模块文件改造成了GBK编码,传递到支付宝的字符串恢复了正常,但是模块在后台中的配置出现了乱码。但是我发现,在模块中,使用t函数,里面使用英文,然后再翻译成中文的方式可以解决这个后台问题。而在这个时候,我对从drupal中传到这个模块的字符串作了处理,charset_encode,就是使用的这个函数。那么现在整个问题就解决了,我只需要使用GBK编码的形式来编写这个模块就可以了。而对从drupal中传递到这个模块中的数据作一次转换。

但是觉得这种方式,不够地道,因为drupal中,所有的模块都是采用UTF-8的格式,如果我的模块采用GBK的话,有点别扭。

我很快想到了,如果模块本身采用UTF-8格式,我只需要反转一下函数charset_encode就可以了,两者之间是对称的。所以我决定,模块本身仍然采用UTF-8的形式。

尽管没有采用GBK的形式,但是中间的替换过程没有白费,因为它至少证明了问题时可解得,而且找到了解决的办法。

当然,这个时候还学习了mb_convert_encoding和iconv这两个函数,也算知道PHP中编码之间是如何转换的了。

转载请注明出处: Think in Drupal

论坛:

Drupal版本:

jeromewen 的头像

很佩服楼主对技术方面的执着,本人这段时间对Drupal非常感兴趣,花了一个星期看了Pro Drupal Development Second Edition,对Drupal的模块机制,还有多站管理,还有Hooks,就像ROR(Ruby on Rails)以严格的命名约定来处理事件机制,确实也很多很不错的Idea,权限管理机制非常不错和灵活,基于RBAC概念,能满足90%以上系统的需要,如果能引入Group就更好拉,Joomla就要差远拉,是很值得学习一个CMS,不过有一点觉得需要改善,请求时的variable也放在一个数据库variable表中,这里性能方面值得考虑,如果我有1000个请求同时并发,就不知道他是怎么处理拉,有很多Java中现在不能实现的,像它在运行时使用模块动态扩展功能,Java必须要使用OSGI才能实现这样优秀的功能.
本来也是打算扩展Drupal + Ubercart2.0建立一个购物网站, 最终还是放弃拉,考虑后期需要使用EJB,以及分布式集群服务,最终还是打算使用JBoss Seam + Richfaces/Icefaces来架构实现这个系统,  还有最差的就是Drupal的User interface,如果没有一个好的美工确实想做好一个漂亮的系统很难, 像Joomla就省了很多事,太量的外国商业模块可以拿来用,提个小小的建议, 个人觉得可以多下载几个商业的漂亮Joomla模版, Joomla Template 与 Drupal Theme都大同小异, 只是Drupal main Navigation是一个树形菜单,实际上分成两级就可以解决拉, 如果我用这个我肯定会这么做,有时间希望能与你多交流这方面的心得和技术,现在对PHP很感兴趣.

g089h515r806 的头像

我以前也是JAva程序员,对php的熟悉程度远没有java好,java适合比较大型的应用,如果你的应用希望能够发展成dangdang这样的网站的话,使用java是比较合适的,而且速度比php快,但是java有一个致命的弱点,那就是开发成本高,对于很多个人应用,如果选用java的话,连一个服务器都比php的贵很多.
Drupal对分布式系统支持的非常好,在drupal7中,甚至直接给出了范例.但是国内用到这样特性的人不多.我从来没有用过.Drupal的主题也有很多,商业版的,都是老外的3000美金一份拷贝.太贵了.我对美工不熟悉,drupal的后台还可以.

jeromewen 的头像

速度方面确实是这样,毕竟Java是编译型语言,属于静态的,不像PHP属于解释型,很喜欢PHP语言精巧的风格,开发速度快,如果是个人或或都是两三个,但是PHP如果有类似Hibernate O/R之类的框架那就是一大快事, 其实说缓存方面Drupal已经做得很不错,完全可以满足不是并发量特大的网站需要,如果自己有能力配置一台服务器,使用Nginx + PHP(FastCGI),将完全可以达到Java的性能,这里是一个牛人
http://blog.s135.com/post/366.htm
经常实际测试配置的结果,我前几天有自己使用Centos 5.2 Linux配置过这个环境, 据说相当于同等环境下Apache的10倍 ,不过因为没有多余的电脑,没有进行过去测试,这个Java因为很多应用都是自己放服务器托管,所以造就了到处理便宜的PHP主机天下,JSP主机一般都很贵,drupal7商业主题我至今还没有看到过,Joomla商业手上倒是倒是有一大把,把它的CSS和Image拿过来改改放入 Drupal标签也觉得非常的不错.

g089h515r806 的头像

drupal中就有类似的O/R之类的框架,有相应的模块支持,schema模块已经超Hibernate的方向前进了一大步了。而drupal的数据库层,和Java中的JDBC非常类似,封装的很漂亮。不过还没有完全实现O/R。因为drupal本身是面向过程的,而不是面向对象的。