本文主要是介绍[转载]修补SynEdit CVS 中文问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SynEdit是SourceForge.net上顶级的语法高亮度显示组件。
Open Source,Delphi的源码。质量和效果都没得说。很多商业和非商业的软件包中都有使用。
用它你可以非常方便的实现一个自己的代码编辑器来。支持众多的语法,支持RTF和HTML输出。非常的方便。
http://community.csdn.net/Expert/TopicView.asp?id=3068979
CSDN的Freicin雪客最近发布的一个小软件,估计就是基于SynEdit的.(纯粹猜测啊!)
美中不足的是中文的处理上有些瑕疵。但凡国外的东西都有这样的毛病,只好自己动手丰衣足食!
经过简短的追踪,调试。很快就找到了问题的关键所在!
source/SynEditExport.pas 的450行左右,下面这个函数的实现有点问题。
function TSynCustomExporter.ReplaceReservedChars(AToken: string;
var IsSpace: boolean): string;
var
I, ISrc, IDest, SrcLen, DestLen: integer;
Replace: string;
c: char; //mh 2000-10-10
begin
IsSpace := TRUE;
if AToken <> '' then begin
SrcLen := Length(AToken);
ISrc := 1;
DestLen := SrcLen;
IDest := 1;
SetLength(Result, DestLen);
while ISrc <= SrcLen do begin
c := AToken[ISrc];
IsSpace := IsSpace and (c = ' ');
//Chinese charactor patch by cker begin. 2004-06-17
{$IFDEF SYN_MBCSSUPPORT}
if (ByteType(AToken,ISrc)= mbLeadByte) and (ISrc <= SrcLen) and (ByteType(AToken,ISrc + 1)= mbTrailByte) then begin
Replace := ReplaceMBCS(AToken[ISrc], AToken[ISrc + 1]);
Inc(ISrc, 2);
end else
{$ENDIF}
//Chinese charactor patch by cker end. 2004-06-17
if fReplaceReserved[c] <> nil then begin
Replace := StrPas(fReplaceReserved[c]);
Inc(ISrc);
{$IFDEF SYN_MBCSSUPPORT}
// end else if ByteType(AToken, ISrc) <> mbSingleByte then begin
end else if (AToken[ISrc] in LeadBytes) and (AToken[ISrc + 1] <> #0) then //mh 2000-10-10
begin
Replace := ReplaceMBCS(AToken[ISrc], AToken[ISrc + 1]);
Inc(ISrc, 2);
{$ENDIF}
end else begin
if IDest > DestLen then begin
Inc(DestLen, 32);
SetLength(Result, DestLen);
end;
Result[IDest] := c;
Inc(ISrc);
Inc(IDest);
continue;
end;
if IDest + Length(Replace) - 1 > DestLen then begin
Inc(DestLen, Max(32, IDest + Length(Replace) - DestLen));
SetLength(Result, DestLen);
end;
for I := 1 to Length(Replace) do begin
Result[IDest] := Replace[I];
Inc(IDest);
end;
end;
SetLength(Result, IDest - 1);
end else
Result := '';
end;
其实原本作者已经意识到了多字节文本的处理,但可能毕竟不是CJK语系的,对此没有太大的兴趣,所以,还是需要自己动手。不管怎样现在我们的SynEdit可以工作了,HTML输出中文的时候再没有乱码了!
如果就此结束的话,还有一个小毛病,就是转换出来默认的CodePage不是中文而是ISO8859-1,这样你需要先手动选择才可以正确的显示中文。
修改也很简单.
SynEditExportHTML.pas 330行左右:
这里修改很方便,就不说了。
function TSynExporterHTML.GetHeader: string;
const
DescriptionSize = 105;
HeaderSize = 47;
FooterSize1 = 58;
FooterSize2 = 24;
NativeHeader = 'Version:0.9'#13#10 +
'StartHTML:%.10d'#13#10 +
'EndHTML:%.10d'#13#10 +
'StartFragment:%.10d'#13#10 +
'EndFragment:%.10d'#13#10;
HTMLAsTextHeader = '<?xml version="1.0" encoding="iso-8859-1"?>'#13#10 +
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'#13#10 +
'<html xmlns="http://www.w3.org/1999/xhtml">'#13#10 +
'<head>'#13#10 +
'<title>%s</title>'#13#10 +
'<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />'#13#10 +
'<meta name="generator" content="SynEdit HTML exporter" />'#13#10 +
'<style type="text/css">'#13#10 +
'<!--'#13#10 +
'body { color: %s; background-color: %s; }'#13#10 +
'%s' +
'-->'#13#10 +
'</style>'#13#10 +
'</head>'#13#10 +
'<body>'#13#10;
这篇关于[转载]修补SynEdit CVS 中文问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!