使用OpenSP将SGML转XML时如何处理HTML实体?
解决SGML转XML时HTML实体的处理问题
核心原因分析
你遇到的错误本质是当前SGML声明使用的字符集不支持扩展字符:原SGML声明指定的BASESET是ISO 646-1983(ASCII字符集,仅包含0-127的字符),而HTML实体对应的Unicode字符(如–对应破折号)、直接输入的扩展字符(如–)都超出了这个字符集范围,导致解析器报错。
分步解决方案
1. 修改SGML声明,支持UTF-8字符集
将SGML声明中的字符集配置改为支持Unicode的UTF-8,这样就能容纳所有HTML实体对应的字符。替换后的SGML声明示例:
<!SGML "ISO 8879:1986" -- SGML声明:支持UTF-8字符集 -- CHARSET BASESET "UTF-8//CHARSET Unicode (UTF-8)//ESC 2/5 4/0" DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED 128 2048 128 <!-- 覆盖Unicode基本多语言平面 --> CAPACITY SGMLREF TOTALCAP 35000 ENTCAP 35000 ENTCHCAP 35000 ELEMCAP 35000 GRPCAP 35000 EXGRPCAP 35000 EXNMCAP 35000 ATTCAP 35000 ATTCHCAP 35000 AVGRPCAP 35000 NOTCAP 35000 NOTCHCAP 35000 IDCAP 35000 IDREFCAP 35000 MAPCAP 35000 LKSETCAP 35000 LKNMCAP 35000 SCOPE DOCUMENT SYNTAX SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 BASESET "UTF-8//CHARSET Unicode (UTF-8)//ESC 2/5 4/0" DESCSET 0 65536 0 <!-- 覆盖全部Unicode基本平面 --> FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 NAMING LCNMSTRT "" UCNMSTRT "" LCNMCHAR "-." UCNMCHAR "-." NAMECASE GENERAL YES ENTITY NO DELIM GENERAL SGMLREF SHORTREF SGMLREF NAMES SGMLREF QUANTITY SGMLREF ATTCNT 250 ATTSPLEN 960 BSEQLEN 960 DTAGLEN 16 DTEMPLEN 16 ENTLVL 16 GRPCNT 250 GRPGTCNT 96 GRPLVL 16 LITLEN 900 NAMELEN 50 NORMSEP 2 PILEN 240 TAGLEN 960 TAGLVL 40 FEATURES MINIMIZE DATATAG NO OMITTAG YES RANK NO SHORTTAG YES LINK SIMPLE NO IMPLICIT NO EXPLICIT NO OTHER CONCUR NO SUBDOC NO FORMAL NO APPINFO NONE>
2. 修正实体声明语法并正确定义HTML实体
原实体声明存在语法错误(多余的"),修改后可选择两种方式定义:
方式一:使用十进制Unicode引用(推荐,避免编码问题)
<!ENTITY ndash "–"> <!ENTITY nbsp " "> <!ENTITY eacute "é">
方式二:直接使用UTF-8字符(需确保文件编码一致)
将SGML文件和DTD文件均保存为UTF-8编码,然后直接输入字符:
<!ENTITY ndash "–"> <!ENTITY nbsp " "> <!ENTITY eacute "é">
3. 修正DOCTYPE声明的语法错误
原DOCTYPE中实体声明缺少闭合引号,修正后的完整示例:
<!DOCTYPE gp [ <!ENTITY % MYDTD SYSTEM "./my_dtd.dtd"> <!ENTITY ndash "–"> <!ENTITY nbsp " "> <!ENTITY eacute "é"> %MYDTD; ]>
4. 确保文件编码一致性
- 将SGML文件、DTD文件全部保存为UTF-8编码(Windows下带BOM或无BOM均可,OpenSP通常能识别)。
- 转换时可通过
osx.exe的-e utf-8参数指定输出编码,确保XML文件的编码正确。
额外技巧:复用HTML实体声明
如果需要支持大量HTML实体,可直接引用标准的HTML实体DTD(需确保文件路径正确):
<!ENTITY % htmlEntities PUBLIC "-//W3C//ENTITIES HTML 4.01//EN" "html.ent"> %htmlEntities;
内容的提问来源于stack exchange,提问作者Yohan Chevalier
相关产品推荐
相关产品推荐

