`
libg
  • 浏览: 57747 次
  • 性别: Icon_minigender_1
  • 来自: 河北邯郸
社区版块
存档分类
最新评论

XML中特殊字符出现乱码的解决方法

阅读更多

 

查看完整版本: [原创]XML中特殊字符出现乱码的解决方法

[原创]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]
页: [1]

分享到:
评论
1 楼 di1984HIT 2015-01-30  
写的很好~~~、、

相关推荐

    Delphi XML-RPC 中文乱码解决方法

    最近要用XML-RPC机制实现delphi程序与Qt程序之间的通信,从开源网站http://sourceforge.net/projects/delphixml-rpc/下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的字符编码是UTF-8,...

    解决Delphi XML-RPC 中文乱码

    此资源不要下载,请下载最新的 最近要用XML-RPC机制实现...下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的 字符编码是UTF-8,而且QT也都是用UTF-8编程,故把传输字符串改为UTF-8就行了,

    PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案

    php中DOMDocument对于xml操作我们只要是英文是没有问题了,但如果是中文字体就会有乱码问题了,下面我们就此问题给各位介绍一些解决办法吧. PHP的DOM内部是utf8机制的,在loadHTML时,是通过检查字符中meta的charset来...

    java中文乱码解决方案

    n 种方法教你解决java中文乱码 struts2中文乱码解决方法 1. 在struts2里面,最好将所有字符都设成utf-8。 ; charset=UTF-8"%&gt; &lt;%@ page pageEncoding="UTF-8" %&gt;1.1 在jsp页面设定字符编码。这边有必有说明的是...

    java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码

    java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码 ——学习参考资料:仅用于个人学习使用!

    解决tomcat下中文乱码问题

    解决tomcat下中文乱码问题, 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

    解决jd-gui-1.6.6乱码问题

    解决两个问题:一、从反编译代码的界面CTRL+C复制是如果选中内容包含中文,贴到其他编辑器时,中文丢失; 二、打开xml文件、properties文件等包含中文时。中文在反编译界面中显示乱码。用其他工具打开正常。

    xml中文乱码问题

    我在javascript中动态生成了一个xml文件,但是中文一直出现乱码,经过几番验证,问题解决。 这是我的源码 解决方案: 将字符集从utf-8换成gb2312,成功实现, 将html头部和javascript的字符集都换成gb2312,终于解决了...

    myEclipse乱码解决办法

    在Myeclipse导入一个项目,有中文乱码问题,解决方法如下: 一、将整个project设置编码UTF-8(UTF-8可以最大的支持国际化) windows-&gt;Preferences-&gt;general-&gt;Workspace-&gt;Text file encoding-&gt;Other框中的Text ...

    解决Delphi XML-RPC 中文乱码、结构/数组等没有解析I4项BUG

    最近要用XML-RPC机制实现delphi程序与Qt程序之间的通信,从...下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的 字符编码是UTF-8,而且QT也都是用UTF-8编程,故把传输字符串改为UTF-8就行了。

    探讨PHP JSON中文乱码的解决方法详解

    我们知道在使用Ajax技术与PHP后台交互时,中文乱码是常有的事,JSON作为与XML类似的数据交换格式,在PHP用来进行交互时也会出现中 文乱码的情况,解决PHP JSON中文乱码的方法思路其实与PHP Ajax传值中文字符乱码的...

    VS+QT——读写XML文件(含中文字符):从建工程开始

    1.VS中没有.pro文件,怎么添加XML模块的使用。 2.XML中含有中文字符时,在写入XML文件时,如何避免中文乱码。 博客链接:https://blog.csdn.net/qq_28662831/article/details/90264682

    filter配置解决乱码问题

    web.xml配置filter和filtermapping,编写类 读取或写死filter的init-params中的字符编码传入 reqeust中 调用dofilter方法,乱码解决

    PHP 生成的XML以FLASH获取为乱码终极解决

    经过探索最终解决。记录之,顺便也记录了通用解决方案。如果你也遇到XML&lt;... 倘若我们使用UTF8编码的外部文本文件,PHP100.com 都不用管它,使用非UTF8编码文本文件且文本中出现中文字符的话,则需要设置

    java处理中文乱码

    java处理中文乱码的三中方法 1.类字符转换 2.struts配置文件处理 3.web.xml配置文件处理

    如过你配置了过滤器无用,下面以下方可以解决AJAX中文乱码

    如果你配置了过滤器,但是中文还会乱码,可以参考下面两种方法解决。

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML认得预定义的特殊“字符实体”,即: & & &gt; &gt; " " &apos; ‘ 这些在XML文档读取时都会被辨认出来,并会被转化成等价的UTF-8字符。比如下面的XML文本: Far & Away 从TiXmlText 对象查询出来时会...

    彻底解决fckeditor(jsp版)上传中文图片乱码问题

    1.修改Web容器的字符编码,如果Web容器用的是Tomcat,则修改conf/server.xml文件,在两个Connector中添加“URIEncoding="utf-8"”,我这里用的是utf-8编码,所以修改成utf-8,若项目是gb2312编码,则设置为...

    mysql乱码问题分析与解决方法

    出现乱码是字符集的原因一般而言和逻辑没有太大关系,也就是说整个系统大的方向没有问题,小的地方出现了漏洞,进而导致程序不能正常运行,所以说出现乱码是一件令人非常很恶心的事情。这里简要介绍一下自己遇到的...

    Cocos2d-x 中文字符xml编辑器

    用于解决中文乱码的问题,读取的时候用代码读取 static CCDictionary *strings = NULL; static CCDictionary *imagePaths = NULL; static std::string getStringByKey(std::string key) { if(strings == NULL) { ...

Global site tag (gtag.js) - Google Analytics