erlang 解决edoc生成中文乱码

昨天突然想edoc一下,英文顺利通过。与到中文就出出问题了。首先抛出的是{'EXIT',{no_translation,[{io,put_chars.....。

搜了一下发现erlang对中文支持不好(litaocheng,Qoom都说过)。但都没有说怎么解决(还是我没搜到?)。最后发现http://erlang.2086793.n4.nabble.com/UTF8-and-EDoc-td2088002.html#a2088002有解决方法。但我打“不”开,幸好是曾军看了好告诉我的。主要是修改两个源码,重新编译。

以下是原文章的解决方案

 

This is my fix to make EDoc work with Japanese (R13B02-1, .erl and
overview.edoc files are saved in UTF-8). I think it will work for
other languages:

1. At edoc_lib:write_file/4

Change

file:open(File)

to

file:open(File, [write, {encoding, utf8}])

This is better than my previous dirty hack.

2. At edoc_tags:parse_tags/5

Change

case dict:fetch(Name, How) of
    text ->
        parse_tags(Ts, How, Env, Where, [T | Ts1]);

to

case dict:fetch(Name, How) of
    text ->
        Data = unicode:characters_to_list(list_to_binary(T#tag.data)),
        T2 = T#tag{data = Data},
        parse_tags(Ts, How, Env, Where, [T2 | Ts1]);

Regards,
Ngoc

 按照上面的操作编译顺利通过(以前是用sudo apt-get install erlang 安装,需要remove掉重新来,花了不少时间),接下来打开网页,发现是乱码。仔细比较发现edoc生成的html默认没有 <meta>标签。

<meta



 http-equiv



="Content-Type" 



content



="text/html;charset=utf-8" 



/







>

我试着手工天加上后就没有乱码了。但不能每次都手工天加上,脑海中突然有个想法--修改源码重新编译(已经晚上7点多了)。API我也没有看(看英文有点费劲,还是要多学学英文的),直接看代码。在/edoc/priv中有edoc.dtd,edoc_generatev两个文件,这个文件的作用,我没有看明白请明白的人指点。

我原本想在生成head时候插入 meta标签,但没有这么简单(模板没有找到)。

通过函数追踪 我总是在edoc_lib:write_file/4和edoc:read/2中徘徊。中间我没有找到插入meta标签的入口(可能我看的不够仔细),最后决定在write_file写之前,插入meta标签。对write_file写之前的list作了分析,用了一个比较笨的方法:

在edoc_liber:write_file(Text, Dir, Name, Package)中把
io:put_chars(FD, Text)改为, 
io:put_chars(FD, get_meta(Text)),
get_meta(L)->

[H|T]=L,
[H1|T1]=T,
[H2|T2]=T1,
[H3|T3]=T2,
[H4|T4]=T3,
[H5|T5]=T4,

[H6|T6]=H5,
[H7|T7]=H6,

[H8|T8]=T7,

[H9|T9]=H8,

[H10|T10]=T9,

[H11|T11]=H10,

[H12|T12]=T11,

[H13|T13]=H12,
ME=[["<","meta http-equiv='Content-Type' content='text/html; charset=utf-8' ",">"],[],["</","meta",">"]],
NH13=[H13 | ME],



NH12=[NH13|T13],

NT11=[NH12|T12],

NH10=[H11|NT11],

NT9=[NH10|T10],

NH8=[H9|NT9],

NT7=[NH8|T8],

NH6=[H7|NT7],
NH5=[NH6|T6],

NT4=[NH5|T5],
NT3=[H4|NT4],
NT2=[H3|NT3],
NT1=[H2|NT2],
NT =[H1|NT1],
NL =[H|NT],
NL.

在此感谢曾{(++)}军的帮助

 疑问:

1、/edoc/priv中有edoc.dtd,edoc_generatev两个文件的作用。

2、插入meta期待更好的解决办法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值