请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 5341|回复: 4

[讨论]XML中特殊字符出现乱码的解决[做AJAX的朋友不要错过] [复制链接]

hopesoft 楼主
帖子
136
体力
596
威望
9
发表于 2006-9-20 03:16:47 |显示全部楼层
作者:琥珀 @ 2006-9-20
http://www.51ajax.com

昨天有朋友问到XML中特殊字符显示有误的问题,搜集了N多资料,终于找到一个解决方案,权当抛砖引玉,给大家提供个思路,希望能有更好的方法。

1.问题描述
XML文档中,一些特殊ASCII字符,显示会有问题,如音乐符号,即使包含在< ! [CDATA[ ] ]中也不行,提示javascript错误:文本内容中发现无效字符。

注:本文中的特殊字符主要是指音乐符号等ASCII码小于32的其中一些字符

2.参考文档

1)网址:http://www.pcdog.com/p/html/20041215/151220044979_1.htm
update:@2006-9-21 这篇文章与本文要解决的特殊字符不是一类问题,仅供参考

3.最终解决方案

1)在网上找到一张ASCII字符表,这个表是解决问题的关键,地址如下:

http://www.51ajax.com/demo/ascii/ascii.htm

ASCII 码大致可以分作三部分组成。   第一部分由 00H 到 1FH 共 32 个,一般用来通讯或作为控制之用,有些字符可显示于屏幕,有些则无法显示在屏幕上,但能看到其效果(例如换行字符、归位字符)。

第二部分是由 20H 到 7FH 共 96 个,这 95 个字符是用来表示阿拉伯数字、英文字母大小写和底线、括号等符号,都可以显示在屏幕上。

第三部分由 80H 到 0FFH 共 128 个字符,一般称为『扩充字符』,这 128 个扩充字符是由 IBM 制定的,并非标准的 ASCII 码。这些字符是用来表示框线、音标和其它欧洲非英语系的字母。

2)具体方法
从第一部分的表中可以看到音乐符号的ASCII是14(十进制),产生问题的原因在于ASCII码小于32的符号有些在屏幕上显示时会有问题,解决的方法如下:

在提交入库前用Javascript将ASCII码小于32的字符用escape()函数编码,然后入库,如编码后将变为%0E,其它字符不变,这样在XML中显示不会出现问题,当用Javascript对XML进行解析时,再用unescape()函数对内容进行解码,这样会将%0E显示为。

我写了一个Javascript函数(只适用于少量数据),可以实现对ASCII码在32以下的字符进行编码。

Javascript函数如下:
  1. function escapeAscii(s){
  2.   var ss=s
  3.   var strNew=""
  4.   for(var i=0;i<s.length;i++){
  5.       strNew+=(ss.charCodeAt(0,1)<32?(escape(ss.substring(0,1))):(ss.substring(0,1)))
  6.       ss=ss.substring(1,ss.length)
  7.     }
  8.    return strNew
  9. }
  10.        
复制代码


做了一个Demo页,可对字符串进行编码、解码,这是地址:http://www.51ajax.com/demo/ascii/index.html
也在AJAX留言板测试一下,已按上述方式在入库前进行了编码,读取时再解码。
这是AJAX留言板的XML页地址:http://www.51ajax.com/guestbook/guestbook.php?action=get

4.存在问题
当数据量比较大时,存在效率问题,我对正则不熟,哪位达人如能用正则写个函数,那应该算是一个比较好的解决方案了。

[ 本帖最后由 hopesoft 于 2006-9-21 09:43 编辑 ]
西部数码顶级域名注册商39元抢注!
帖子
1282
体力
2879
威望
0
居住地
四川省 成都市
发表于 2006-9-20 08:41:14 |显示全部楼层
$

这个符号在XML中怎么办?
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

hopesoft 楼主
帖子
136
体力
596
威望
9
发表于 2006-9-20 09:11:07 |显示全部楼层
$的ASCII码是36,不会出现乱码,见AJAX留言板第107号留言的回复

使用道具 举报

帖子
9
体力
24
威望
0
发表于 2006-9-20 09:23:23 |显示全部楼层
实体与编码都是xml最基础的概念,如果这些个概念还没搞清楚,建议重新学习xml基础知识。

使用道具 举报

hopesoft 楼主
帖子
136
体力
596
威望
9
发表于 2006-9-21 09:27:33 |显示全部楼层
我的理论一向很差,呵呵,有不足之处欢迎踊跃拍砖。

另:我指的特殊字符主要是指音乐符号等ASCII码小于32的其中一些字符。

51ajax.com上网友nukq回复到:
XML标准规定的无效字节为:

  /*
   0x00 - 0x08
   0x0b - 0x0c
   0x0e - 0x1f
   */

所以很简单,输出的时候过滤这些字符就万无一失了,下面是PHP的实现。

/* PHP 实现 */
function XmlSafeStr($s)
{
  return preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/",'',$s);
}


这种方式应该是直接过滤掉特殊字符,新浪的Blog在提交一些特殊字符时,也会被过滤掉。

不知有没有保留特殊字符的解决方案?或上面的PHP代码能否改成把特殊字符替换为编码过的字符?如替换为%0E?

第2条 网上那个的方法和我的方法应该不是解决一类问题,放在一起有些不合适,容易误导,回头再仔细研究一下,整理一下。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-11 21:17 , Processed in 0.110251 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部