ChineseSupportGB2312

<< | Cookbook-V1 | >>

Note: The recipes here are for PmWiki versions 0.6 and 1.0 only. For PmWiki 2.0 recipes, see Cookbook.


Describe ChineseSupportGB2312 here.

I wish it would help. (download from other site) It is for version pmwiki-0.5.5. PmWiki is good but the chinese support is so goood. So we use MoinMoin instead but I love PmWiki better. I don't know how to change it to support unicode sorry!

注:本文所述方法,最好在Pmwiki刚安装,没有修改任何东东之前实施。

一、Pmwiki简介:   PmWiki是一个不需要数据库的以php为主要语言编写的wiki,小巧方便,很适合个人网站建站使用。当前版本为:0.5.5[ http://www.pmichaud.com/pmwiki ]。中文网上有郑晓云的¡°刻录事¡¤沙之书¡±[ [(approve links) edit diff] ],做了很多尝试,并提供了系列学习笔记。

二、PmWiki中文支持方面的问题:   PmWiki安装后,默认iso-8859-1字符集,需要经常调整字符显示,不方便。

  做一些尝试性的修改,将PmWiko.php Line57 "Content-Type: text/html; charset=iso-8859-1;");   改为 "Content-Type: text/html; charset=gb2312;"); //"Content-Type: text/html; charset=iso-8859-1;");Modi by Rocket. 2003.6.25

  现在不用再每次都需改变浏览器字符集调整显示了。

  进一步尝试,发现不少中文字保存后会变成乱码,或变成别的文字。如测试的¡®测¡¯,什么的¡®什¡¯等。并导致后面所跟随的文字全部变成乱码。

  到¡°刻录事¡±上查看,发现¡°刻录事¡±用的是Unicode,尝试修改为Unicode。乱码没有了,但发现存在文字被¡®篡改¡¯的现象,如历史的¡®史¡¯会变成¡®及¡¯。(后比较测试,约154个GB2312基本文字或符号会被PmWiki¡®篡改¡¯。)

三、原因分析与解决思路:

  (注:如果您就想解决问题,可以跳过此部分直接看第四部分:解决方法stepbystep)

  经分析,产生的错误原因是,内建的替换回行等的分隔符是\262~\264(在pmwiki.php Line 185~187中定义)。\262经转换后为B0,位于GB2312编码范围(A1A1~FEFE,A1-A9:符号区,包含682个符号B0-F7:汉字区,包含6763个汉字)内。

  寻找解决办法时,参考到phpwiki(我看的版本是1.3.4),phpwiki下lib/config.php Line34~37中有一段注释,受到启发: // "\x80"-"\x9f" (and "\x00" - "\x1f") are non-printing control // chars in iso-8859-* // $FieldSeparator = "\263"; //this is a superscript 3 in ISO-8859-1. $FieldSeparator = "\x81";

  尝试将\262~\264改为 \x81~\x83,发现生成的页面中,前面的一些出错的文字错误都没有出现,最后通过了gb2312所有7千多个文字符号的测试(见后),一般的中文文档显示都不会有问题。

  但是看系统自带的那些文档,如pmwiki手册,就会出现格式、文字的错误。一个简单的解决的方法是让它在阅读以前的文档时,继续使用\262~\264。

  查看PmWiki的运行规则。老文件都放在wikilib.d目录下,修改过的文件会存放到wiki.d目录下。这样问题就简单了,如果阅读wikilib.d目录下的文件,用老的分隔符,如果阅读wiki.d下的文件,用新的。

  经过程序分析,给出如下解决办法:

四、解决方法stepbystep:

  对PmWiki.php程序修改如下(基于0.5.5,其他版本应能类推):

  1)将Line 185~187 $Newline = "\262"; $KeepToken = "\263"; $LinkToken = "\264";   改为 $Newline = "\x81"; //$Newline = "\262"; //Modi by Rocket. 2003.6.25 $KeepToken = "\x82"; //$KeepToken = "\263"; //Modi by Rocket. 2003.6.25 $LinkToken = "\x83"; //$LinkToken = "\264"; //Modi by Rocket. 2003.6.25

  2)程序中涉及阅读的子程序有两个:   Line 764 function HandleBrowse($pagename)   作用是阅读文件。

  Line 802 function HandleEdit($pagename)   作用是读入文件供编辑本页。

  做子函数Patch_GB2312()和Patch_BackOld() function Patch_GB2312($pagefilename){ //add by Rocket. 2003.6.25 global $Newline,$KeepToken,$LinkToken; if (file_exists('wikilib.d/'.$pagefilename)&!file_exists('wiki.d/'.$pagefilename)){ $Newline = "\262"; $KeepToken = "\263"; $LinkToken = "\264"; } }

function Patch_BackOld(){ //add by Rocket. 2003.6.25 global $Newline,$KeepToken,$LinkToken; $Newline = "\262"; $KeepToken = "\263"; $LinkToken = "\264"; }   加入队尾Line 997.

  修改HandleBrowse()的 Line769 和HandleEdit()的 Line 806 if (!$page) { Abort("Invalid page name"); }   改为 if (!$page) { Abort("Invalid page name"); } else Patch_GB2312($pagename); //Modi by Rocket. 2003.6.25

  3)由于HandleEdit后还要输出PmWiki.EditQuickReference,快速编辑参考,这是一个老文档,需要不管三七二十一,变回老的分隔符,所以修改Line 812,强制变量赋值: $HTMLTitle = "Edit $pagename"; $GCount = 0;   改为: $HTMLTitle = "Edit $pagename"; $GCount = 0;Patch_BackOld();//Modi by Rocket. 2003.6.25

  4)剩下一些小打小闹的修改,有的您可能前面已经做了:   将Line57 "Content-Type: text/html; charset=iso-8859-1;");   改为: "Content-Type: text/html; charset=gb2312;"); //"Content-Type: text/html; charset=iso-8859-1;");Modi by Rocket. 2003.6.25

五、测试:

  1)中文:   在网上下载GB2312-80字符集基本集gb2312.txt,在PmWiki中(我试的是生成gb2312字符集的,UTF-8的未试)新建GB2312TestPage,拷入所有基本汉字,保存,生成页面后查看源文件,将汉字部分拷贝出来,简单处理掉其中的html代码,保存成文本文件,和gb2312.txt进行比较。结果完全一致。证明对GB2312的支持是完整的。

  2) 显示:   没有认证测试,大致看了一圈,没有发现问题。   如果您发现有什么纰漏,请到[ [(approve links) edit diff] ]与我联系。

  3)UTF-8:   重新安装,将Line57改为Unicode,进行测试。 "Content-Type: text/html; charset=UTF-8;"); //"Content-Type: text/html; charset=iso-8859-1;");Modi by Rocket. 2003.6.25   发现中文篡改错误明显增多,看来这个方法不适合与UTF-8编码方式。

isisask?: how about UTF-8 in zh-TW? Ê¿´ó·ò °´Ê±µç·çÉȵط½·¸µÃÉÏ·¢Ê¿´ó·òÊ®·Ö

pmwiki-2.3.38 -- Last modified by {{}}?

from IP: 85.171.160.186 ip should be disabled by default for security reasons