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]

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警 以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。 阅读详情

相关推荐

从拆解到调试:用CS5523改造旧款车载显示屏的完整记录(MIPI转eDP方案)

本文详细记录了使用CS5523芯片将旧款车载显示屏从MIPI接口改造为eDP驱动的完整过程。通过对比LT8911等芯片,选择CS5523实现低功耗、高兼容性的显示升级,涵盖硬件改造、固件配置及调试技巧,最终成功提升显示效果200%。

web99的专栏 343

读取文本文件的时候,乱码的解决办法...

1. 文件头: http://www.wapforum.org/DTD/wml_1.1.xml"> 2. 文本文件的内容用utf-8的格式来写3. 文本文件保存成什么格式没有具体的要求,最好保存成ANSI, 如果保存成 utf-8的话,在第一行开头会出现下面的问题 "锘�" 或 "鄘?" 4. 在读文件的时候,如果ascii码为32(空格)的时候,只需要输出" "就行了,不需要

我的地盘,哈哈... 2875

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

java读写properties文件和xml文件,解决中文乱码问题

在开发当中我们经常需要用到配置文件,我们可以在配置文件中很方便的设置需要进行修改和配置的参数值,有时候我们本地开发和生产环境中有些参数也不一样,比如数据库IP和账号密码等、要读取的文件夹路径、日志备份的时间和周期等等,有些人可能会说直接将这些值定义为final变量不久可以了吗?这样的缺点是我们将项目部署到生产环境中时还要重新调整Java代码,然后重新生成jar包或者war包,而定义到配置文件中可以直接打开jar进行修改,我们在配置文件中设置这些参数就很方便后续进行修改。

sunzixiao的博客 2111

ESP32 Arduino 学习篇(五)TFT_eSPI库

该库有User_Setup.h和 User_Setup_Select.h两个配置文件,支持 ①自定义参数或 ②使用已有配置 驱动TFT屏幕。优点是: 1. 占用空间非常小 2. 动画清晰,充分利用每个像素点 3. 可以非常灵动. 4. 方便进行微调。首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面。初始化屏幕, 如果是ST7735,可以往里面传一个参数, 具体用到时再看。缺点是: 1. 容易闪屏 2. 一般不会太复杂 3.需要大量的计算。特别注意: 字库7是仿7段数码屏的样式。

DOF526570的博客 2万+

深入LSM6DSL的FIFO连续模式:基于STM32和MEMS库的数据流高效处理指南

本文深入探讨了LSM6DSL的FIFO连续模式,结合STM32硬件平台和ST官方MEMS库,提供了高效的数据流处理方案。通过优化I2C通信时序、中断驱动设计以及动态ODR调整,实现低功耗数据采集与处理,显著提升嵌入式传感器应用的性能和续航能力。

weixin_30387799的博客 347

URL中文乱码解决

URL中文乱码解决(多种方法)(2)  使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。  一、初级解决方法  通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照

爱是一种信仰 1360

Android SDK 国内镜像及配置方法(2025最新,包好使!)

android sdk 国内镜像配置方法,纯小白避坑指南,2025最新,亲测包好使!还有包奉上!

土豆是狗的博客 4671

从XML文件乱码问题,探寻其背后的原理

由于网友反应本文图片不能显示,由于时间关系未能及时修正。请访问原文地址: 本文出自http://blog.youkuaiyun.com/dinglang_2009/article/details/6895355,转载请注明出处。 在日常开发工作中,我们经常会使用到XML,早已成为了一种标准。它的用途非常的广泛,但这些不是本文所重点讨论的。 相信大家在做开始时候经常碰到过“乱码”的问题,这...

weixin_30354675的博客 197

银河麒麟V10安装docker

最近在做的一个信创项目使用的操作系统是银河麒麟高级服务器V10,在安装docker时,会遇到下面的错误。 nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.0-3.el7.x86_64 经过分析,以下依赖包是centos系统中的包,所以需要给kylinos创建一个合适的centos源。经过实验,Kylin Linux Advanced Server V1

m0_38004228的博客 4907

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

XML乱码? Java replace乱码?

解决XML乱码问题XML 特殊符号乱码常用特殊字符解决办法Dom4j 生成 XML 然后replace乱码自行封装方法生成XML XML 特殊符号乱码 首先强调GBK环境 不识别很多特殊符号比如:上下角标。原因我就不多说,自行百度。 常用特殊字符解决办法 //没啥特殊得解决办法,替换呗 public class SpecialSymbolsUtil { //上标 public fi...

qq_43324513的博客 373

22h2版本的win10安装Docker Desktop时页面空白

摘要:Windows10 22H2系统重装Docker时出现安装界面卡死问题,通过管理员CMD执行静默安装命令解决。命令指定了WSL-2后端及多个自定义数据存储路径(安装目录、Hyper-V数据、Windows容器数据、WSL数据),安装需等待几分钟。最终验证安装成功。

猿小白的博客 650

delphi 操作 utf-8 的xml 有乱码的解决

   说明下,这个方法有好大的缺陷,XML必须要严格正确,如果有什么特殊字符,会导致出错,其次,并不能很好的解决日文或韩文问题,我已经换成了c#了 这两天要用delphi 做个东西要与 xml相关, 开始只是想用 delphi本身的控制,网上找了下, 有两种方式,一个是 TXMLDocument 在 Internet 面板下, 另一个是用 IXMLDomDocument 需要用到 单元文件

成不了佛,便堕落吧 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

xajax特殊字符乱码解决方案

xajax特殊字符乱码解决方案 XML标准规定的无效字节为: /* 0x00 - 0x08 0x0b - 0x0c 0x0e - 0x1f */ 所以很简单,输出的时候过滤这些字符就万无一失了,下面是PHP的实现。 /* PHP 实现 */ function XmlSafeStr($s) { return preg_replac...

ynw520的专栏 332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

XML解析出现An invalid XML character (Unicode: 0x**) was found in the comment.

在生产环境上,第三方通讯传输内容有XML不允许的特殊字符,我暂且叫它乱码。 这些乱码导致XML解析报错An invalid XML character (Unicode: 0x**) was found in the comment. 或者其他相同的意思。 解决办法有2个: 1是叫第三方通讯传输内容控制乱码,比如0x1c等等 2是自己在解析xml之前,对内容进行乱码过滤 第2

qhgseeg的专栏 3797

php xml特殊字符处理,php – 如何正确解码XML文件中的特殊字符?

在我正在解析的一些XML文件中(通常是RSS),我运行的文本包含像今天最新的字符,在我从节点中提取文本后,它变成了今天的最新版本.这告诉我,我正在错误地处理解码过程.我可以简单地用patch my script修复这个错误,但是如果还有许多其他字符变得乱码呢?在将XML文件转换为UTF-8脚本时,如何在不破坏编码的情况下消化XML文件的正确方法是什么?以下是我尝试过的一些看似不太合适的事情:$xm...

weixin_34717586的博客 393

xml学习笔记1--XML语法

XML语法: 一、文档声明 二、元素 三、属性 四、注释 五、CDATA区、特殊字符 六、处理指令(processing instruction) 一、文档声明(没有声明的xml文档成为格式不良好的xml文档) 在编写xml文档时,需要先使用文档声明,声明xml文档的类型。 最简单的声明语法: 用encoding属性说明文档的字符编码: (如果有中文一定要声明) 用

韬晦潜胖蛇的专栏 1313

解决Tomcat中文乱码问题

html已经设置了js引用也已加上 charset="utf-8", 没有的话都要加上。多种情况可以逐一去排查。

weixin_45907672的博客 1715

使用get方法提交form表单时出现乱码解决方法

最近在编程的时候,发现分别用get和post发送中文数据,后者可以得到正确结果, 前者却是乱码。查了些资料,发现服务器对post和get请求的数据的编码处理是不一样的 。现把tomcat下get和url直接发送请求乱码的解决办法列举如下:方法1. String name = r...

136

Android查看apk清单文件乱码

如何解决Android查看apk清单文件乱码问题 作为一名经验丰富的开发者,我将向你介绍如何解决Android查看apk清单文件乱码问题。首先,我们需要了解整个操作的流程,然后详细说明每一步需要做什么以及使用的代码。 流程 下表展示了解决Android查看apk清单文件乱码问题的步骤: 步骤 操作 1 解压a...

weixin_32056343的博客 335

总结解决中文数据库乱码或者页面显示乱码问题

1、在页面最上面加上: 2、配置数据库连接的时候 jdbc.mysql.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true 3、项目web.xml中配置 CharacterFilter org.springfr

孤天浪雨 1万+

UTF-8转GBK的悲剧:特殊字符C2A0

这个问题出现得比较早:在传给印象派的作品描述XML(GBK编码)中一些文字信息经常包含乱码,而且会一乱到底,甚至导致不同页的错乱。刚开始一直都没有什么头绪,不过后来终于发现了部分头绪:GBK的字符集过小,对一些特殊字符的转码会出现乱码—-一些生僻字也就算了,但是其中却包括这个字符:C2A0—-一个在网页上经常使用排版用全角空格。就是这么个字符,用户从网页端拷贝了一段文字,复制到界面上显示正常,保存

ccm1125的专栏 1万+

java项目使用winrm4j 命令中含有特殊字符和读取文件内容乱码问题。使用版本是0.12.3

使用winrm4j 执行命令中含有特殊字符和读取文件内容乱码问题

wlj_wangjun的博客 417

一个特殊的内码转换处理对于XML格式的UTF-8

一个特殊的内码转换处理对于XML格式的UTF-8 一般来说我们所使用的中文网站都是基于UTF-8的,只需要在录制或者是回放时设置对应的编码就行了,但是随着技术的升级,慢慢的我们发现有些内容的UTF-8无法处理了。 例如在新版的discuz!.net 3.0中,采用了新的AJAX处理方法,将登陆成功的信息通过UTF-8 的XML返回,这样就出现了一个问题,无法针对这个返回进行检查点函数了(LR不会对返回的XML进行UTF-8解析),这里给出两个解决方案: 1.检查点函数直接用UTF-8编码后的乱码来做

用心做事,用爱生活 1636
上一篇: Apache服务器配置技巧-基本
下一篇: Javascript实现web编辑器-兼容FF和IE
libgcn
博客等级 码龄16年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值