有一个chm文件导致cs2w报告错误,这个文件在firefox的CHMreader插件上浏览和在windows用都很正常,所以说明cs2w还存在问题,
__DEBUG__模式编译的cs2w报告如下错误:
$ ./cs2w -T template/ -C plone2 plonebook-zh-0_5-1.chm
Extracting chm done.
system value = 3
system value = 10
system value = 9
system value = 4
lcid = 2052
system value = 2
system value = 3
system value = 6
hhc =
system value = 0
hhc = plone-docs.hhc
system value = 12
system value = 13
system value = 15
Parse encoding = gb2312
I/O error : Is a directory
Parsing chm hhc ... SAX.startDocument()
SAX.endDocument()
I/O error : Is a directory
finished.
Convert plonebook-zh-0_5-1.chm to web finished.
You can browse "plone2/cs2w_index.html" to visit.
~
具体我看了一下代码,可能是在parser.c文件中对hhc文件的解析有问题,这一个chm文件的hhc文件与一般的有些不同。
我用python-chm包重新做了一个python版的cs2w.py小程序,为此,先分析一下cs2w小程序的结构:
1. 程序有三个主要文件: chm2web.c parser.c parser.h
主函数中运行时先getopt解析参数,extract_chm将chm中的内容释放出来,
parse_hhc_file是解析hhc文件时在目标目录生成一个tree_items.js文件,
最后是将template里面的内容复制到目标目录。
请jungle看一下是不是这样的?
然后我的程序就是按照这个结构进行设计的,
1. 先是同样的getopt解析参数,extract_chm解压缩文件,
shutil复制template的文件,
还有一个专门的hhc文件解析器,
51 class TopicsParser(SGMLParser):
这个TopicsParser继承自SGMLParser,利用了SGMLParser的很多优点,只用了50行代码就写完了,能够解析一般的chm文件和这个特殊的chm文件。
: python-chm包中居然没有一个解压缩的函数,
这里的extract_chm是调用系统的extract_chmLib命令,
在debian系统下这个命令属于libchm-bin包。
最终的结果就是附件中的cs2w.py文件,全部代码包含注释一共是228行,用法与原始的cs2w相同。
这个原始的chm文件因为超过了group的1M限制,只单独发给jungle测试,在这里只把这个不同的hhc文件发上来。
>
>
--
程任全
问题是出在去 hhc 信息的地方,原来的代码只考虑到了,但实际上没有去取 ;P
--- chm2web.c.orig 2007-04-21 10:48:45.000000000 +0800
+++ chm2web.c 2007-04-21 10:49:00.000000000 +0800
@@ -274,6 +274,7 @@
cursor = buffer + index;
d(printf("hhc = %s\n", buffer + index + 2));
+ sprintf(hhc_file, "/%s", buffer + index + 2);
break;
case 4:
@@ -291,7 +292,7 @@
cursor = buffer + index;
if(!strlen(hhc_file)) {
- snprintf(hhc_file, sizeof(hhc_file),
"/%s.hhc", buffer + index + 2);
+ sprintf(hhc_file, "/%s.hhc", buffer +
index + 2);
if (chm_resolve_object(cf, hhc_file,
&ui) != CHM_RESOLVE_SUCCESS)
hhc_file[0] = '\0';
>
> 我用python-chm包重新做了一个python版的cs2w.py小程序,为此,先分析一下cs2w小程序的结构:
> 1. 程序有三个主要文件: chm2web.c parser.c parser.h
> 主函数中运行时先getopt解析参数,extract_chm将chm中的内容释放出来,
> parse_hhc_file是解析hhc文件时在目标目录生成一个tree_items.js文件,
> 最后是将template里面的内容复制到目标目录。
>
> 请jungle看一下是不是这样的?
>
没错,是这样的。
> 然后我的程序就是按照这个结构进行设计的,
> 1. 先是同样的getopt解析参数,extract_chm解压缩文件,
> shutil复制template的文件,
> 还有一个专门的hhc文件解析器,
> 51 class TopicsParser(SGMLParser):
> 这个TopicsParser继承自SGMLParser,利用了SGMLParser的很多优点,只用了50行代码就写完了,能够解析一般的chm文件和这个特殊的chm文件。
>
> : python-chm包中居然没有一个解压缩的函数,
> 这里的extract_chm是调用系统的extract_chmLib命令,
> 在debian系统下这个命令属于libchm-bin包。
>
> 最终的结果就是附件中的cs2w.py文件,全部代码包含注释一共是228行,用法与原始的cs2w相同。
>
在 Debian 下需要哪些包?我执行后遇到下面的提示:
$ ./cs2w.py -T template/ -C test plonebook-zh-0_5-1.chm
Extracting chm ... done.
Parsing chm hhc ...
Traceback (most recent call last):
File "./cs2w.py", line 228, in ?
main()
File "./cs2w.py", line 220, in main
gen_book_tree(target, nodeTree)
File "./cs2w.py", line 155, in gen_book_tree
_printTree(nodeTree)
File "./cs2w.py", line 145, in _printTree
print >> book_tree_file, templ % (
UnicodeEncodeError: 'ascii' codec can't encode characters in position
3-6: ordinal not in range(128)
我的 Debian 系统是 etch,有下面这些 python 相关的包:
$ dpkg -l|grep python
ii pychecker 0.8.17-3 Finds common
bugs in python source code
ii python 2.4.4-2 An interactive
high-level object-oriented language (default vers
ii python-cairo 1.2.0-1 Python bindings
for the Cairo vector graphics library
ii python-central 0.5.12 register and
build utility for Python packages
ii python-chm 0.8.4-0.1 Python binding for CHMLIB
ii python-dev 2.4.4-2 Header files and
a static library for Python (default)
ii python-doc 2.4.4-1 Documentation
for the high-level object-oriented language Python
ii python-examples 2.4.4-2 Examples for the
Python language (default version)
ii python-gdbm 2.4.4-1 GNU dbm database
support for Python
ii python-glade2 2.8.6-8 GTK+ bindings:
Glade support
ii python-gtk2 2.8.6-8 Python bindings
for the GTK+ widget set
ii python-libxml2 2.6.27.dfsg-1 Python bindings
for the GNOME XML library
ii python-minimal 2.4.4-2 A minimal subset
of the Python language (default version)
ii python-numeric 24.2-7 Numerical
(matrix-oriented) Mathematics for Python
ii python-subversion 1.4.2dfsg1-2 Python bindings
for Subversion
ii python-support 0.5.6 automated
rebuilding support for python modules
ii python-xml 0.8.4-6 XML tools for Python
ii python2.4 2.4.4-3 An interactive
high-level object-oriented language (version 2.4)
ii python2.4-dev 2.4.4-3 Header files and
a static library for Python (v2.4)
ii python2.4-doc 2.4.4-2 Documentation
for the high-level object-oriented language Python
ii python2.4-examples 2.4.4-3 Examples for the
Python language (v2.4)
ii python2.4-minimal 2.4.4-3 A minimal subset
of the Python language (version 2.4)
还要安装哪个包?
-- jungle
在print阶段出现UnicodeEncodeError说明系统缺省编码可能是ascii的,于是打印不出来;
> print >> book_tree_file, templ % (
> UnicodeEncodeError: 'ascii' codec can't encode characters in position
可以这样测试一下是不是utf-8的:
$ python
Python 2.4.3 (#2, Oct 6 2006, 07:52:30)
[GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>
> -- jungle
以致于没有测出到这个BUG。
在各人的机器上可以根据选择打开这个开关或者在程序里面单独设置defaultencoding:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
--
Zhang Le, Robert
http://zhllg.blogspot.com
http://zh.gentoo-wiki.com
http://savannah.nongnu.org/projects/pgubook
http://groups.google.com/group/gentoo-china
http://groups.google.com/group/szlug
$ python2.4 -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
'/usr/lib/python24.zip',
'/usr/lib/python2.4',
'/usr/lib/python2.4/plat-linux2',
'/usr/lib/python2.4/lib-tk',
'/usr/lib/python2.4/lib-dynload',
'/usr/local/lib/python2.4/site-packages',
'/usr/lib/python2.4/site-packages',
'/usr/lib/python2.4/site-packages/HTMLgen',
'/usr/lib/python2.4/site-packages/Numeric',
'/usr/lib/python2.4/site-packages/PIL',
'/usr/lib/python2.4/site-packages/cairo',
'/usr/lib/python2.4/site-packages/gst-0.10',
'/usr/lib/python2.4/site-packages/gtk-2.0',
'/usr/lib/site-python']
这里的if 0就是开关变量,把它改成1就可以根据locale来自动设置defaultencoding,如设置之后就会发现defaultcoding根据环境变量会变化:
$ python2.4 -c 'import sys; print sys.getdefaultencoding()'
utf-8
$ LANG=C python2.4 -c 'import sys; print sys.getdefaultencoding()'
ascii
$ LANG=en_US python2.4 -c 'import sys; print sys.getdefaultencoding()'
ISO8859-1
$ LANG=zh python2.4 -c 'import sys; print sys.getdefaultencoding()'
eucCN
$ LANG=zh_CN python2.4 -c 'import sys; print sys.getdefaultencoding()'
gb2312
$ LANG=zh_CN.UTF-8 python2.4 -c 'import sys; print sys.getdefaultencoding()'
utf-8
更好地找到site.py是使用-S选项调用python,以使它不加载site.py,这样打印出的sys.path就是在加载site.py之前的路径,site.py文件肯定在这些路径之一,这样搜索范围就小很多:
$ python2.4 -S -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
'/usr/lib/python24.zip',
'/usr/lib/python2.4/',
'/usr/lib/python2.4/plat-linux2',
'/usr/lib/python2.4/lib-tk',
'/usr/lib/python2.4/lib-dynload']
--
程任全
上面的补丁我是按照最初上传来的文件改的。主要就是在 case 0: 里面加一行赋值语句。
> $ ./cs2w -T template/ -C plone ~/Desktop/plonebook-zh-0_5-1.chm
> Extracting chm .......................................................................................................................................................................................................
> done.
> encoding error : input conversion failed due to input error, bytes
> 0xD1 0x62 0x50 0x6C
> encoding error : input conversion failed due to input error, bytes
> 0xD1 0x62 0x50 0x6C
> I/O error : encoder error
> Parsing chm hhc ... finished.
>
你加上 __DEBUG__ 再看看上面的错误信息出现在什么位置。
> 运行的过程中打开cs2w_index.html看到少了一些章节,
> 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
>
我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。
> 另外,在cs2w_header.html中我建议增加一个"Close This
> Frame"的链接,因为上面那个100像素高的frame一直显示的话不太好,应该给用户一个很方便地关闭它的途径,也在附件里面。
>
我考虑的是 template 目录下面的文件只作为简单的示例,如果是在公司局域网内用,可以参照这个例子替换自己的 logo,改成自己的风格。
-- jungle
我估计是跟 encoding 处理有关。在 parser.c 代码里面你可以看到,encoding
作为参数传入了,但没有使用,因为在我这里测试的时候发现,系统自动转换成 utf-8 了。
-- jungle
encoding error : input conversion failed due to input error, bytes
0xD1 0x62 0x50 0x6C
Parsing chm hhc ... SAX.startDocument()
SAX.startElement(html)
SAX.startElement(head)
SAX.startElement(meta)
SAX.endElement(meta)
SAX.endElement(head)
SAX.startElement(body)
SAX.startElement(object)
type = text/site properties
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = -1
depth = 0
title = 关于本书 local = trunk/000-about.html
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 0
depth = 0
title = 第1章:介绍Plone local = trunk/010-plone-overview.html
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 0
depth = 1
title = 什么是内容管理系统? local = trunk/010-plone-overview.html#id2
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 1
title = 你是否需要一个内容管理系统? local = trunk/010-plone-overview.html#id3
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 1
title = 介绍Plone的特性 local = trunk/010-plone-overview.html#id4
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 2
title = 打包 local = trunk/010-plone-overview.html#id5
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 国际化 local = trunk/010-plone-overview.html#id6
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 可用性(Usability) local = trunk/010-plone-overview.html#usability
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 支持皮肤(Skin) local = trunk/010-plone-overview.html#skin
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 注册和个性化 local = trunk/010-plone-overview.html#id7
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 工作流和安全管理 local = trunk/010-plone-overview.html#id8
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 可扩展性 local = trunk/010-plone-overview.html#id9
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 内容定制 local = trunk/010-plone-overview.html#id10
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 文档 local = trunk/010-plone-overview.html#id11
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 社区 local = trunk/010-plone-overview.html#id12
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 3
title = 中文技术社区 local = trunk/010-plone-overview.html#id13
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 3
title = Plone.org资源 local = trunk/010-plone-overview.html#plone-org
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 3
title = Plone网站示例 local = trunk/010-plone-overview.html#id14
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
encoding error : input conversion failed due to input error, bytes
0xD1 0x62 0x50 0x6C
I/O error : encoder error
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 1
title = 进入Plone的开发 local = trunk/010-plone-overview.html#id15
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 0
title = 第2章 安 local = trunk/010-plone-overview.html#id15
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(body)
SAX.endElement(html)
SAX.endDocument()
finished.
Convert /home/rae/Desktop/plonebook-zh-0_5-1.chm to web finished.
You can browse "plone/cs2w_index.html" to visit.
>
> > 运行的过程中打开cs2w_index.html看到少了一些章节,
> > 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
要么请你把制作好的cs2w整个源代码再打个包发上来吧。
> >
>
> 我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。
我原来制作解析器的时候就想把它生成的tree_item.js输出达到与cs2w的输出一致,不知怎么还有这些空格的不同。要么可以使用diff -b比较一下。
>
需要开发效率的时候我使用python来做,需要运行效率的场合我会使用C来做一个;因此我不仅需要知道在python里怎么解析一个XML,还需要知道在C里面怎么解析XML。
比较奇怪,出现错误信息的地方只有创建 tree_item.js 文件的函数调用。
...
...
只有这么多输出,还是有其他的没有贴上来?
> >
> > > 运行的过程中打开cs2w_index.html看到少了一些章节,
> > > 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
> 要么请你把制作好的cs2w整个源代码再打个包发上来吧。
见附件。
> >
> > 我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。
> 我原来制作解析器的时候就想把它生成的tree_item.js输出达到与cs2w的输出一致,不知怎么还有这些空格的不同。要么可以使用diff -b比较一下。
>
其实你的程序输出更工整一些 :)
我把 cs2w 的输出也发上来。
>
> 需要开发效率的时候我使用python来做,需要运行效率的场合我会使用C来做一个;因此我不仅需要知道在python里怎么解析一个XML,还需要知道在C里面怎么解析XML。
>
这两种实现方法的效率差别不大,最费时的部分都是在调用 libchm 的 C 库。
-- jungle
我在 Debian 下测试,找到原因了。
这份 plone 的 chm 文件实际使用了 gbk 编码,但制作的时候却写成 gb2312。
测试方法是在 parse.c 的 parse_hhc_file 函数里面,在传入 encoding 前,将值改成 gbk 或 gb18030 都可以正确解析。
doc = htmlSAXParseFile(hhc_file,
encoding,
hhSAXHandler,
file);
NetBSD 因为不支持 gbk 编码,可能忽略了特殊的字符,倒可以继续进行解析。
-- jungle
没有截断,是只有这么多输出。
但是我知道问题所在了。
仔细看为什么解析器到这里就忽然停下来了?
> > title = 第2章 安 local = trunk/010-plone-overview.html#id15
上面的tree_item.diff中还有这样一个不同:
- ['第2章 安裝Plone', 'trunk/020-install-plone.html',
+ ['第2章 安砚Plone', 'trunk/020-install-plone.html',
这个"裝"居然被换成了"砚"字。
这个"裝"实际上是个繁体字,在python下可以很轻松地发现:
>>> u = u'安裝Plone'
>>> print u
安裝Plone
>>> u.encode('GB2312')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'gb2312' codec can't encode character u'\u88dd' in
position 1: illegal multibyte sequence
>>> u.encode('GBK')
'\xb0\xb2\xd1bPlone'
>>> u.encode('cp936')
'\xb0\xb2\xd1bPlone'
>>> u.encode('GB18030')
'\xb0\xb2\xd1bPlone'
这个"裝"是在GBK也就是cp936里面才有的字符,
对比LCID的解析结果,应该是这里有问题,cs2w的解析结果是gb2312,而python-chm的解析结果是cp936。
我再给chm2web.c文件作这样一个小的修改于是cs2w就能处理好这个文件了,生成的tree_item.js是正确的,但不知会不会引起其它的问题?
=== modified file 'chm2web.c'
--- chm2web.c
+++ chm2web.c
@@ -225,7 +225,7 @@
break;
case 0x804:
case 0x1004:
- strcpy(encoding, "gb2312");
+ strcpy(encoding, "cp936");
break;
}
}
在这个文件里有一份较全的查找表:/usr/lib/python2.4/site-packages/chm/chm.py
61 locale_table = {
...
87 0x0404 : ('cp950', "Chinese_Taiwan", "Traditional Chinese"),
88 0x0804 : ('cp936', "Chinese_PRC", "Simplified Chinese"),
89 0x0c04 : ('cp950', "Chinese_Hong_Kong", "Traditional Chinese"),
90 0x1004 : ('cp936', "Chinese_Singapore", "Simplified Chinese"),
91 0x1404 : ('cp950', "Chinese_Macau", "Traditional Chinese"),
...
--
程任全
你的改法是对的,不应该用 gb2312。
> 在这个文件里有一份较全的查找表:/usr/lib/python2.4/site-packages/chm/chm.py
>
> 61 locale_table = {
> ...
> 87 0x0404 : ('cp950', "Chinese_Taiwan", "Traditional Chinese"),
> 88 0x0804 : ('cp936', "Chinese_PRC", "Simplified Chinese"),
> 89 0x0c04 : ('cp950', "Chinese_Hong_Kong", "Traditional Chinese"),
> 90 0x1004 : ('cp936', "Chinese_Singapore", "Simplified Chinese"),
> 91 0x1404 : ('cp950', "Chinese_Macau", "Traditional Chinese"),
> ...
多谢!
-- jungle
>
--
程任全