前兩天去一家公司面試,里面有一道XML的題目,題目沒什么難的,但由于編碼問題引發了一些問 題,我回來后嘗試探索了一下
題目要求:把下面的XML文件用XSL轉換成html表格顯示出來,并按pubDate降序排列
XML文件
1
<? xml version="1.0" ?>
2
<? xml-stylesheet type="text/xsl" href="books.xsl" ?>
3
< books >
4
< book id ="1" pubDate ="20050707" >
5
< title > c# XML入門經典 </ title >
6
< description > 編程人員必被的XML技能 </ description >
7
</ book >
8
< book id ="2" pubDate ="20050607" >
9
< title > XSL編程精要 </ title >
10
< description > 從XML到HTML </ description >
11
</ book >
12
< book id ="3" pubDate ="20050607" >
13
< title > .NET framework框架程序設計 </ title >
14
< description > 框架程序設計 </ description >
15
</ book >
16
</ books >
當時我習慣的在桌面上建立文本文件,然后手工輸入:
XSLT
1
<? xml version="1.0" ?>
2
< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" >
3
< xsl:template match ="/" >
4
< html >
5
< body >
6
< table border ="1pt" >
7
< tr >
8
< td > BookId </ td >
9
< td > Title </ td >
10
< td > Description </ td >
11
< td > PubDate </ td >
12
</ tr >
13
< xsl:apply-templates select ="http://book" >
14
< xsl:sort select ="@pubDate" order ="descending" />
15
</ xsl:apply-templates >
16
</ table >
17
</ body >
18
</ html >
19
</ xsl:template >
20
< xsl:template match ="book" >
21
< tr >
22
< td >< xsl:value-of select ="@id" /></ td >
23
< td >< xsl:value-of select ="title/text()" /></ td >
24
< td >< xsl:value-of select ="description/text()" /></ td >
25
< td >< xsl:value-of select ="@pubDate" /></ td >
26
</ tr >
27
</ xsl:template >
28
</ xsl:stylesheet >
注意:上面的XML代碼由于FTB插入XML代碼功能有問題,<后和>前都不能有空格,這也是XML Well-Format的要求.
然后在IE里瀏覽XML文件,提示:文本內容中發現無效字符;我檢查過文件,文件沒有非法字符,所以我覺得可能是XML編碼問題,然后在頂部的指令里加入encoding="UTF-8",按理來說,UTF-8完全適合題涉及到字符集,但還是提示:文本內容中發現無效字符,而改成encoding="GB2312"就正常了,什么原因呢?
我回來嘗試了一下,一般有兩種情況:
情況1:
默認情況下,windows的notepad把文件保存為ANSI格式,在這種情況,設定不同encoding有不同的結果:
encoding="windows-1252",不出錯,但中文顯示為亂碼;
encoding="GB2312" ,正常顯示;
encoding="UTF-8" ,出錯,提示文本內容中發現無效字符 ;
情況2:
把xml文件在notepad另包存為UTF-8格式,
encoding="windows-1252",出錯,提示不支持從當前編碼到指定編碼的切換;
encoding="GB2312" ,出錯,提示不支持從當前編碼到指定編碼的切換;
encoding="UTF-8" ,正常;
例外:不設置encoding的值,默認就是UTF-8,所以把這種情況歸入UTF-8的情況.
那么如何來理解上面的兩種情況呢?
W3C定義了三條XML解析器如何正確讀取XML文件的編碼的規則:
1,如果文擋有BOM(字節順序標記,一般來說,如果保存為unicode格式,則包含BOM,ANSI則無),就定義了文件編碼
2,如果沒有BOM,就查看XML聲明的編碼屬性
3,如果上述兩個都沒有,就假定XML文擋采用UTF-8編碼
現在,讓我們嘗試用上面的三條規則來解釋上面出現的情況:
情況1分析:
由于XML默認被保存ANSI格式,如果設置encoding="UTF-8",那么XML解析器就把文件以UTF-8格式 來解析,由于文件的實質格式是ANSI,而ANSI和UTF-8除了其中128個字符的編碼相同外,其他的 都不相同而被解析器認為無效字符,所以出現"文本內容中發現無效字符"的錯誤了;設置為 encoding="windows-1252",解析器以windows-1252來解析,ANSI其實就是windows-1252,所以編 碼相同,解析器能順利解析,但中文出現亂碼又如何理解呢?windows-1252是單字節字符集,而 中文是需要雙字節編碼的,所以只能解析為亂碼。設置encoding="GB2312"能夠正常顯示,那又如 何理解呢?因為GB2312是雙字節的中文簡體字符集?前面不是說文件的實質格式是單字節的ANSI 嗎?這就是矛盾的地方。
情況2分析:
由于文件被保存為UTF-8(Unicode的其中一種編碼方式),所以文件包含BOM,按照W3G的規則來解釋 ,XML解析器將以UTF-8解析XML而忽略encoding的設置。可實際上是不能忽略encoding的設置的, 否則無法解釋情況2出現的現象。
遺留問題:
本文并沒能完全分析情況1,2的現象。不知道大家是如何理解這些情況的呢?
posted on 2009-03-05 12:30
何克勤 閱讀(346)
評論(0) 編輯 收藏 所屬分類:
XML相關