http://www.51ajax.com/bbs/viewthread.php?tid=198&page=1&extra=page%3D1#pid534
[原创]XML中特殊字符出现乱码的解决方法
作者:琥珀 @ 2006-9-20
http://www.51ajax.com
昨天有朋友问到XML中特殊字符显示有误的问题,搜集了N多资料,终于找到一个解决方案,权当抛砖引玉,给大家提供个思路,希望能有更好的方法。
1.问题描述
XML文档中,一些特殊ASCII字符,显示会有问题,如音乐符号,即使包含在< ! [CDATA[ ] ]中也不行,提示javascript错误:文本内容中发现无效字符。
2.网上对XML中的特殊字符有一种解决方法,但无法解决上述问题
网址: http://www.pcdog.com/p/html/20041215/151220044979_1.htm
以下为引用内容:
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函数如下:
也在 AJAX留言板测试一下,已按上述方式在入库前进行了编码,读取时再解码。
这是AJAX留言板的XML页地址: http://www.51ajax.com/guestbook/guestbook.php?action=get
4.对已有数据的转换
可考虑批量转换一下数据,将特殊字符编码入库;同时修改原有程序,保证入库的特殊字符都经过编码。
这里有篇文章, js中的escape及unescape函数的php实现
5.存在问题
当数据量比较大时,存在效率问题,我对正则不熟,哪位达人如能用正则写个函数,那应该算是一个比较好的解决方案了。
http://www.51ajax.com
昨天有朋友问到XML中特殊字符显示有误的问题,搜集了N多资料,终于找到一个解决方案,权当抛砖引玉,给大家提供个思路,希望能有更好的方法。
1.问题描述
XML文档中,一些特殊ASCII字符,显示会有问题,如音乐符号,即使包含在< ! [CDATA[ ] ]中也不行,提示javascript错误:文本内容中发现无效字符。
2.网上对XML中的特殊字符有一种解决方法,但无法解决上述问题
网址: http://www.pcdog.com/p/html/20041215/151220044979_1.htm
以下为引用内容:
引用:
由于这些特殊字符比较多,我们在XML中替换的工作量比较大,我们可以在DTD文件中作些定义:
比如DTD文件中增加以下部分:复制内容到剪贴板并在XML中定义这个XML文件需要这个DTD支持:代码:
<!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;">复制内容到剪贴板并在XML中定义这个XML文件需要这个DTD支持: 这样在XML文件中出现 & ® ™ 这类特殊字符就不会再报错了。代码:
<!DOCTYPE HeadCount SYSTEM "eula.dtd">
有关更多的特殊字符可以参看:
http://www.51ajax.com/demo/ascii/CourtDocument11-2002-05s-DTD.txt
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函数如下:
复制内容到剪贴板
做了一个Demo页,可对字符串进行编码、解码,这是地址:
http://www.51ajax.com/demo/ascii/index.html
代码:
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
}
也在 AJAX留言板测试一下,已按上述方式在入库前进行了编码,读取时再解码。
这是AJAX留言板的XML页地址: http://www.51ajax.com/guestbook/guestbook.php?action=get
4.对已有数据的转换
可考虑批量转换一下数据,将特殊字符编码入库;同时修改原有程序,保证入库的特殊字符都经过编码。
这里有篇文章, js中的escape及unescape函数的php实现
5.存在问题
当数据量比较大时,存在效率问题,我对正则不熟,哪位达人如能用正则写个函数,那应该算是一个比较好的解决方案了。
欢迎光临
无忧AJAX!分享 交流 进步!