2007-08-25

 

AsciiDoc中文标题-出现问题原因

昨天下载了AsciiDoc,想照着例子做个练习,没想到一开始就遇到了麻烦:
当把title项改成汉字的时候,总会报出类似:
ERROR: xxx.txt: line 7: closing [blockdef-listing] delimiter expected
的错误.
上网没有找到解决办法,只有自己分析了.给asciidoc.py下了断点:
写了下面这个测试文件:

这是一个标题
==========

标题包含6个汉字,下面跟着12个=.
分别用UTF-8和UTF-8(No BOM)保存文件,对asciidoc.py进行跟踪:

当跟到

title_len = char_len(title)
ul_len = char_len(ul)

时,发现title_len的返回值是6或7(带BOM),和我预想的12不同.
所以在底下执行

if not (ul_len-3 < title_len < ul_len+3): return False

就返回了,造成了不能正常执行完毕.
看来,原作者没有考虑到在中文环境下,一个汉字占2个ascii字符的位置的情况.

所以我将那两行改成了

title_len = len(title)
ul_len = len(ul)

心想反正在UTF-8情况下,字符都是占用2个字节,只要直接比较len就可以了.

结果完全出乎我的意料:

title_len的值和ul_len的值变成了:18(21,带BOM的情况)和12!
看来UTF-8下,=还是一个字节,而汉字也不是2个字节!

上网上找到下面一段话:

UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。

看来,问题不是这么简单了.

无奈,我注释掉

if not (ul_len-3 < title_len < ul_len+3): return False

这样就可以编译带中文标题的文件了,但不知道对别的什么情况有影响了.

标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?