?????? 眾所周知,XML的快速發(fā)展,已經越來越多地出現(xiàn)在數(shù)據(jù)交互、文件配置和格式化的數(shù)據(jù)載體中,盡管XML支持的語言越來越多,但是還是有些字符是不被支持的。我在工作中就遇到了這樣的問題,通過.csv文件錄入數(shù)據(jù),然后通過在程序中轉化為XML中間文件,再將XML文件錄入進行處理時發(fā)生異常,經過分析,是由于.csv文件中含有XML不支持的非法字符。
?????? 查詢XML規(guī)范(http://www.w3.org/TR/2004/REC-xml-20040204),得知:XML支持的字符范圍:
[2]??? |
Char |
???::=??? |
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] |
/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ |
從字符串中檢測XML不支持的字符的Java代碼:
??1
public?static?int?checkCharacterData(String?text)
{
??2
??3
????????int?errorChar=0;
??4
??5
????????if?(text?==?null)?
{
??6
??7
????????????return?errorChar;
??8
??9
????????}
?10
?11
????????//?do?check
?12
?13
????????char[]?data?=?text.toCharArray();
?14
?15
????????for?(int?i?=?0,?len?=?data.length;?i?<?len;?i++)?
{
?16
?17
????????????char?c?=?data[i];
?18
?19
????????????int?result?=?c;
?20
?21
????????????//?high?surrogate
?22
?23
????????????if?(result?>=?0xD800?&&?result?<=?0xDBFF)?
{
?24
?25
????????????????//?Decode?surrogate?pair
?26
?27
???????????????int?high?=?c;
?28
?29
???????????????try?
{
?30
?31
?????????????????int?low?=?text.charAt(i+1);
?32
?33
?????????????????if?(low?<?0xDC00?||?low?>?0xDFFF)?
{
?34
?35
????????????????????char?ch=(char)low;
?36
?37
????????????????????//System.err.println(ch);
?38
?39
?????????????????}
?40
?41
?????????????????//?Algorithm?defined?in?Unicode?spec
?42
?43
?????????????????result?=?(high-0xD800)*0x400?+?(low-0xDC00)?+?0x10000;
?44
?45
?????????????????i++;
?46
?47
???????????????}
?48
?49
???????????????catch?(IndexOutOfBoundsException?e)?
{
?50
?51
???????????????????e.printStackTrace();
?52
?53
???????????????}
?54
?55
????????????}
?56
?57
?
?58
?59
????????????if?(!isXMLCharacter(result))?
{
?60
?61
????????????????//?Likely?this?character?can't?be?easily?displayed
?62
?63
????????????????//?because?it's?a?control?so?we?use?its?hexadecimal
?64
?65
????????????????//?representation?in?the?reason.
?66
?67
????????????????errorChar++;
?68
?69
????????????}??????
?70
?71
????????}
?72
?73
????????//?If?we?got?here,?everything?is?OK
?74
?75
????????return?errorChar;
?76
?77
????}
?78
?79
?
?80
?81
????
?82
?83
????private?static?boolean?isXMLCharacter(int?c)?
{
?84
?85
?????????if?(c?<=?0xD7FF)??
{
?86
?87
?????????????if?(c?>=?0x20)?return?true;
?88
?89
?????????????else?
{
?90
?91
??????????????????if?(c?==?'\n')?return?true;
?92
?93
??????????????????if?(c?==?'\r')?return?true;
?94
?95
??????????????????if?(c?==?'\t')?return?true;
?96
?97
??????????????????return?false;
?98
?99
?????????????}
100
101
?????????}
102
103
?
104
105
?????????if?(c?<?0xE000)?return?false;??if?(c?<=?0xFFFD)?return?true;
106
107
?????????if?(c?<?0x10000)?return?false;??if?(c?<=?0x10FFFF)?return?true;
108
109
???????
110
111
?????????return?false;
112
113
????}
114



??2

??3

??4

??5



??6

??7

??8

??9

?10

?11

?12

?13

?14

?15



?16

?17

?18

?19

?20

?21

?22

?23



?24

?25

?26

?27

?28

?29



?30

?31

?32

?33



?34

?35

?36

?37

?38

?39

?40

?41

?42

?43

?44

?45

?46

?47

?48

?49



?50

?51

?52

?53

?54

?55

?56

?57

?58

?59



?60

?61

?62

?63

?64

?65

?66

?67

?68

?69

?70

?71

?72

?73

?74

?75

?76

?77

?78

?79

?80

?81

?82

?83



?84

?85



?86

?87

?88

?89



?90

?91

?92

?93

?94

?95

?96

?97

?98

?99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114
