虽然CJK中文支持有诸多问题,但很多国内期刊依然采用这一方式,因此下面这个解决方案也是让大家了解乱码的处理方法和乱码的原因。用xeCJK来支持的话,这个问题得到了有效解决。 最近使用pdflatex写点东西,然后就又一次遇到了中文书签乱码,以前是用英文写,现在实在是不爽,然后在网上搜到了gbk2uni这个程序,是可以用,但是我的源文件全是utf8的,实在不想转码。于是看了看他的源代码,原来就是一个简单的转码,把中文转为\ooo八进制数据,于是乎自己用python写了一个脚本,ok。 代码传到google code了 http://code.google.com/p/pdflatex-cjkbookmark/ 当你使用pdflatex的时候一般都的执行两次,第一次扫描和简单的输出,第二次是完成链接和跳转,在第一次的时候会输出一个out结尾的文件,这个就是bookmark。 以下是我的tex测试程序:

%global style
\documentclass[a4paper]{book}
\usepackage{CJK}
\usepackage[colorlinks=true, pdfstartview=FixWidth, CJKbookmarks=true]{hyperref}
%--------------------------------------------
\begin{document} \begin{CJK*}{UTF8}{song} \large
%begin of document
\title{Test}
\author{buaa.byl@gmail.com}
\date{\today}
\maketitle
\tableofcontents
%*******************************************************************************
\part{第一部分:测试}
\chapter{如何测试程序}
Test就是测试的意思。
%*******************************************************************************
%end of document
\end{CJK*} \end{document}
第一次执行完pdflatex book.tex后会有一个book.out:
\BOOKMARK [-1][-]{part.1}{I 第一部分:测试}{}% 1
\BOOKMARK [0][-]{chapter.1}{如何测试程序}{part.1}% 2
......
重点就是把这几个中文转为\ooo的格式, 最简单的当然就是用python内置的正则表达式提取,然后解码,然后用ord转换。 结果是这样的:
\BOOKMARK [-1][-]{part.1}{\376\377\000\111\000\040\173\054\116\000\220\350\122\006\377\032\155\113\213\325}{}
\BOOKMARK [0][-]{chapter.1}{\376\377\131\202\117\125\155\113\213\325\172\013\136\217}{part.1}
脚本如下:
# -*- coding:utf-8 -*-
import sys
import re
'''\BOOKMARK [1][-]{section.0.1}{bookmark string}{}'''
uniprefix = '\\376\\377'
f = open(sys.argv[1])
data = f.read()
f.close()
data = data.decode('UTF-8')
lines = data.split('\n')
ARG_BOOKMARK_STRING = 4
pattern_bookmark = r'(\\BOOKMARK)' + r' ' + \
r'\[(.*)\]' + \
r'\[(.*)\]' + \
r'\{(.*)\}' + \
r'\{(.*)\}' + \
r'\{(.*)\}'
regex_bookmark = re.compile(pattern_bookmark)
fmt_bookmark = '%s' + ' ' + \
'[%s]' + \
'[%s]' + \
'{%s}' + \
'{%s}' + \
'{%s}'
def conv_ucs2(s):
lst_chars = []
for c in s:
d = ord(c)
tmp = '\\%03o' % ((d >> 8) & 0xFF)
lst_chars.append(tmp)
tmp = '\\%03o' % (d & 0xFF)
lst_chars.append(tmp)
return lst_chars
lst_result = []
for line in lines:
res = regex_bookmark.search(line)
if res:
lst_args = list(res.groups())
lst_chars = conv_ucs2(lst_args[ARG_BOOKMARK_STRING])
lst_chars.insert(0, uniprefix)
lst_args[ARG_BOOKMARK_STRING] = ''.join(lst_chars)
lst_result.append(fmt_bookmark % tuple(lst_args))
else:
lst_result.append(line)
f = open(sys.argv[1], 'w')
f.write('\n'.join(lst_result))
f.close()
然后再执行一次pdflatex book.tex 最终的效果如图: esnap_57 选自:http://www.thinkemb.com/wordpress/?p=260

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部