[原创]XML中特殊字符出现乱码的解决方法
[b]作者:琥珀 @ 2006-9-20 [/b]
[url]http://www.51ajax.com[/url]
昨天有朋友问到XML中特殊字符显示有误的问题,搜集了N多资料,终于找到一个解决方案,权当抛砖引玉,给大家提供个思路,希望能有更好的方法。
[b]1.问题描述[/b]
XML文档中,一些特殊ASCII字符,显示会有问题,如音乐符号,即使包含在< ! [CDATA[ ] ]中也不行,提示javascript错误:文本内容中发现无效字符。
[b]2.网上对XML中的特殊字符有一种解决方法,但无法解决上述问题[/b]
网址:[url]http://www.pcdog.com/p/html/20041215/151220044979_1.htm[/url]
以下为引用内容:
[quote]
由于这些特殊字符比较多,我们在XML中替换的工作量比较大,我们可以在DTD文件中作些定义:
比如DTD文件中增加以下部分:
[code]
<!ENTITY half "& #x00BD;">
<!-- VULGAR FRACTION ONE HALF -->
<!ENTITY frac12 "& #x00BD;">
<!-- VULGAR FRACTION ONE HALF -->
<!ENTITY frac14 "& #x00BC;">
<!-- VULGAR FRACTION ONE QUARTER -->
<!ENTITY frac34 "& #x00BE;">
<!-- VULGAR FRACTION THREE QUARTERS -->
<!ENTITY frac18 "& #x215B;">
[/code]
并在XML中定义这个XML文件需要这个DTD支持:
[code]
<!DOCTYPE HeadCount SYSTEM "eula.dtd">
[/code]
并在XML中定义这个XML文件需要这个DTD支持: 这样在XML文件中出现 & ® ™ 这类特殊字符就不会再报错了。
有关更多的特殊字符可以参看:
[url]http://www.51ajax.com/demo/ascii/CourtDocument11-2002-05s-DTD.txt[/url]
[/quote]
[b]3.最终解决方案[/b]
[b]1)在网上找到一张ASCII字符表,这个表是解决问题的关键,地址如下:[/b]
[url]http://www.51ajax.com/demo/ascii/ascii.htm[/url]
ASCII 码大致可以分作三部分组成。 第一部分由 00H 到 1FH 共 32 个,一般用来通讯或作为控制之用,有些字符可显示于屏幕,有些则无法显示在屏幕上,但能看到其效果(例如换行字符、归位字符)。
第二部分是由 20H 到 7FH 共 96 个,这 95 个字符是用来表示阿拉伯数字、英文字母大小写和底线、括号等符号,都可以显示在屏幕上。
第三部分由 80H 到 0FFH 共 128 个字符,一般称为『扩充字符』,这 128 个扩充字符是由 IBM 制定的,并非标准的 ASCII 码。这些字符是用来表示框线、音标和其它欧洲非英语系的字母。
[b]2)具体方法[/b]
从第一部分的表中可以看到音乐符号的ASCII是14(十进制),产生问题的原因在于ASCII码小于32的符号有些在屏幕上显示时会有问题,解决的方法如下:
在提交入库前用Javascript将ASCII码小于32的字符用escape()函数编码,然后入库,如编码后将变为%0E,其它字符不变,这样在
XML中显示不会出现问题,当用Javascript对XML进行解析时,再用unescape()函数对内容进行解码,这样会将%0E显示为。
我写了一个Javascript函数(只适用于少量数据),可以实现对ASCII码在32以下的字符进行编码。
Javascript函数如下:
[code]
function escapeAscii(s){
var ss=s
var strNew=""
for(var i=0;i<s.length;i++){
strNew+=(ss.charCodeAt(0,1)<32?(escape(ss.substring(0,1))):(ss.substring(0,1)))
ss=ss.substring(1,ss.length)
}
return strNew
}
[/code]
做了一个Demo页,可对字符串进行编码、解码,这是地址:[url]http://www.51ajax.com/demo/ascii/index.html[/url]
也在[url=http://www.51ajax.com/guestbook]AJAX留言板[/url]测试一下,已按上述方式在入库前进行了编码,读取时再解码。
这是AJAX留言板的XML页地址:[url]http://www.51ajax.com/guestbook/guestbook.php?action=get[/url]
[b]4.对已有数据的转换[/b]
可考虑批量转换一下数据,将特殊字符编码入库;同时修改原有程序,保证入库的特殊字符都经过编码。
这里有篇文章,[url=http://www.51ajax.com/bbs/viewthread.php?tid=199&extra=page%3D1]js中的escape及unescape函数的php实现[/url]
[b]5.存在问题[/b]
当数据量比较大时,存在效率问题,我对正则不熟,哪位达人如能用正则写个函数,那应该算是一个比较好的解决方案了。
nukq
2006-9-20 17:24
楼上的,走弯路了 :)
XML标准规定的无效字节为:
/*
0x00 - 0x08
0x0b - 0x0c
0x0e - 0x1f
*/
所以很简单,输出的时候过滤这些字符就万无一失了,下面是PHP的实现。
/* PHP 实现 */
function XmlSafeStr($s)
{
return preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/",'',$s);
}
[[i] 本帖最后由 nukq 于 2006-9-20 05:26 PM 编辑 [/i]]
hopesoft
2006-9-20 20:07
我测试过新浪的Blog,特殊字符会被替换掉,不知是否和你的方法一样。
有没有保留特殊字符的解决方案?这块儿砖没白抛,希望更多高手出玉,呵呵。
nukq
2006-9-20 21:13
[quote]原帖由 [i]hopesoft[/i] 于 2006-9-20 08:07 PM 发表
我测试过新浪的Blog,特殊字符会被替换掉,不知是否和你的方法一样。
有没有保留特殊字符的解决方案?这块儿砖没白抛,希望更多高手出玉,呵� ... [/quote]
如果你说的特殊字符是指& ® ™这些,那可能跟你使用的encoding有关,使用UTF-8的话就完全没有问题,
XML规定的无效字符是ascii码 <32的一部分控制符,跟这些“& ® ™特殊”字符是不冲突的。
我用的是简单的正规匹配过滤,可能有一些现成的XML模块已经提供了自动过滤非法字符的功能,我在这方面也没有更多的信息 :)
[[i] 本帖最后由 nukq 于 2006-9-20 09:24 PM 编辑 [/i]]
hopesoft
2006-9-21 09:15
我指的特殊字符主要是指音乐符号[color=red][b][/b][/color]等ASCII码小于32的其中一些字符。
网上那个的方法和我的方法应该不是解决一类问题,放在一起有些不合适,容易误导,回头再仔细研究一下,整理一下。:)
nukq
2006-9-21 14:05
[quote]原帖由 [i]hopesoft[/i] 于 2006-9-21 09:15 AM 发表
我指的特殊字符主要是指音乐符号
等ASCII码小于32的其中一些字符。
网上那个的方法和我的方法应该不是解决一类问题,放在一起有些不合适,容� ... [/quote]
音乐符号 ascii 是0x0d ,没有被过滤的。
hopesoft
2006-10-29 23:39
[quote]原帖由 [i]nukq[/i] 于 2006-9-21 02:05 PM 发表
音乐符号 ascii 是0x0d ,没有被过滤的。 [/quote]
音乐符号 ascii 是0x0e,呵呵
mrcooldog
2007-7-12 18:19
在C#中可以过滤音乐符号吗?
popoci456
2008-8-20 12:09
[color=black]大屏幕
中达视讯事业部主要为中国各种重要场合提供专业、清晰、可靠的大屏幕显示系统、解决方案与完善服务。
依托母公司台达电子集团在世界视讯领域的核心领先技术,在大屏幕拼接显示系统领域(包括室外LED),中达电通能为客户提供从光机、投影显示单元、图像拼接控制器到大屏幕系统控制软件的全系列产品。
目前,中达已建立了一流的大屏幕投影系统产品研发与生产基地,是目前国内最大的DLP投影显示系统生产厂商之一,并拥有多项国家专利,产品已广泛应用
于全国各通信运营商、电力、公安、车站、机场、地震、气象、水利等众多行业,重量级客户包括国家气象局、首都机场、山东潍柴等。
[/color][url=http://www.delta-cimic.com/product/ups.html][color=black]ups[/color][/url][color=black]
[/color][url=http://www.delta-cimic.com/product/dapingmu.html][color=black]大屏幕[/color][/url]
相关推荐
在使用 Firefox 浏览器时,如果 URL 中包含中文字符,可能会出现乱码问题。这是因为 Firefox 浏览器的配置问题。解决方案是:在 Firefox 中输入 about:config,修改 network.standard-url.escape-utf8 为 False...
然而,XML文件在处理中文字符时经常会出现乱码问题,这主要是由于编码不一致或编码声明错误导致的。本程序专门针对这个问题提供解决方案。 在处理XML文件时,首先要理解的是字符编码的概念。字符编码是用来表示文本...
然而,在使用 Dom4J 输出 XML 文档时,中文字符可能会出现乱码问题。这是因为 Dom4J 的默认编码方式可能不支持中文字符。解决这个问题的方法是将输出编码方式设置为 UTF-8。 设置输出编码方式 ------------------ ...
Maven发布Jar包中文乱码解决方法 Maven 是一个基于项目对象模型(Project Object...通过在 pom.xml 文件中添加配置、在 Maven 命令中添加参数、在资源文件中添加配置等方式,可以解决 Maven 发布 Jar 包中文乱码问题。
默认情况下,Flex使用Unicode编码(通常是UTF-8或UTF-16)来处理字符串,但如果XML文件使用的是其他编码,如GBK、BIG5等,那么在没有正确指定编码的情况下,Flex将无法正确解析XML中的字符,导致乱码出现。...
2. **SQL语句的编码**:在编写XML映射文件或者动态SQL时,如果直接在字符串中写入中文,且IDE或编辑器的编码与MyBatis运行环境的编码不一致,也可能导致乱码。 3. **结果集映射**:在处理查询结果时,如果实体类中...
当这个文件中的中文字符出现乱码时,会给流程设计和执行带来困扰。以下是如何解决jbpm中gpd.xml中文乱码问题的详细步骤和相关知识点: 首先,我们需要理解的是字符编码的基础知识。在计算机中,文本是以二进制形式...
最近要用XML-RPC机制实现delphi程序与Qt程序之间的通信,从开源网站http://sourceforge.net/projects/delphixml-rpc/下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的字符编码是UTF-8,...
当XML文件以UTF-8编码存储,包含中文字符,而Java程序运行环境采用的不是UTF-8编码,反序列化过程中,XML数据会被按照错误的编码解析,导致中文字符无法正确显示,从而产生乱码。在上述代码中,可以看到反序列化过程...
本方案提供了一个简洁有效的解决方法,通过一个Java文件和在`web.xml`配置文件中的简单设置,可以有效地解决乱码问题。 首先,我们要理解乱码产生的原因。在Web应用中,乱码通常发生在以下几个环节: 1. **请求...
在本篇文章中,我们将深入探讨如何解决C#与ASP.NET页面中出现的中文乱码问题,这不仅涉及到配置文件的正确设置,还包括对HTTP响应头的调整,以及代码层面的注意事项。 ### 标题解析:“C#, ASP.NET 页面中文乱码...
- 日志输出时,确保日志框架(如Log4j、SLF4J等)的配置文件中指定了正确的字符集,避免在打印SQL语句时出现乱码。 7. **文件读写**: - 如果是从文件中读取或写入数据,确保文件的读写操作使用了与数据库相同的...
解决方法是修改服务器对 uri 参数的默认值 server.xml 中,设置 URIEncoding=“UTF-8”或者逆向转码,先把数据通过 iso8859-1 还原成字节,然后再解码成 UTF-8。 4. post 方法传参乱码 post 方法传参乱码是由于...
在信息技术领域,乱码问题是指字符在计算机中由于编码不一致或者不正确而导致的显示错误,通常表现为无法识别的特殊符号或者乱糟糟的方块。润乾报表乱码问题尤其令人头疼,因为它影响了数据的显示和传输,尤其是对于...
解决Flex中文乱码问题的方法主要有以下几种: 1. **服务器端设置**:确保服务器返回的数据是以UTF-8编码的。在PHP中,可以使用`header('Content-Type: text/plain; charset=utf-8')`来设定输出编码;在Java中,可以...
Java 乱码问题是 Java 开发中常见的问题之一,解决这个问题需要了解 Java 的编码方式、JSP 中文乱码问题、Tomcat 5.5 中文乱码问题、JDBC ODBC Bridge 的 Bug 及其解决方法、Solaris 下 Servlet 编程的中文问题及...
- `encodeURIComponent()` 方法:这个方法比`encodeURI()` 更强大,会编码更多的特殊字符,包括在`encodeURI()` 中未编码的字符。 解决URL中文乱码的一种方法是使用JavaScript进行编码,然后在服务器端解码。有两...
综上所述,解决Spring框架中使用注解处理JSON数据时出现中文乱码的问题主要涉及三个方面的内容:明确客户端和服务端之间的字符集编码、检查并修正XML配置文件以及引入必要的依赖库。通过对这些问题的细致分析和合理...
"jsp乱码解决超酷,通过web.xml配置"这个标题表明,我们将通过配置`web.xml`文件来解决JSP页面中的乱码问题。下面将详细介绍这个过程以及相关的知识点。 首先,我们需要理解JSP乱码产生的原因。当用户通过表单提交...