我一直在使用Access和VBA生成XML站点地图。我让我们的开发人员实现了一个服务器端解决方案,这样它就可以每晚运行而不必记住这样做。
我通过将文本写入文件来生成文件。非常简单。我的文件大约是1800KB。
开发人员的解决方案将文本写入文件(使用XmlWriter VB类)。他的文件大约是900KB。
当他第一次向我展示这一点时,我认为他错过了站点地图中的大量数据。当我检查每行中的行数时,只有38行差异(大约22,500行文本)。
这怎么可能?
不确定这是否是正确的stackexchange网站发布,但我不是更合适的。
以下是文件
的示例<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.bodykind.com/index.aspx</loc>
</url>
<url>
<loc>http://www.bodykind.com/category/3-Supplements.aspx</loc>
</url>
<url>
<loc>http://www.bodykind.com/category/4-Wellbeing.aspx</loc>
</url>
...
两个文件几乎完全相同,但&lt; url&gt;是一个不同的顺序,一个比另一个多36个。
我刚检查了文档属性。似乎900KB文件的代码集是UTF-8,但1800KB文件的代码集是Unicode。我假设这就是为什么会有这么大的差异?
由于它即将被关闭,这里是两个代码
Private Sub Class_Initialize()
pIndent = True
Set objADO = CreateObject("ADODB.Stream")
objADO.Type = 2
objADO.Charset = "utf-8"
objADO.LineSeparator = 10
objADO.Open
objADO.WriteText "<?xml version=""1.0"" encoding=""UTF-8""?>", 1
End Sub
... some code which writes the text to the file
Public Sub SaveToFile(ByVal PATH As String)
' Skip the BOM
objADO.Position = 3
Dim BinaryStream As Object
Set BinaryStream = CreateObject("ADODB.stream")
BinaryStream.Type = 1
BinaryStream.Mode = adModeReadWrite
BinaryStream.Open
'Strips BOM (first 3 bytes)
objADO.CopyTo BinaryStream
objADO.flush
objADO.Close
BinaryStream.SaveToFile PATH, 2
BinaryStream.flush
BinaryStream.Close
Set BinaryStream = Nothing
Set objADO = Nothing
End Sub
Using writer As New XmlTextWriter(Server.MapPath(filename), Encoding.UTF8)
writer.WriteStartDocument()
writer.WriteStartElement("urlset")
writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
writer.Formatting = Formatting.Indented
writer.WriteStartElement("url")
writer.WriteElementString("loc", domain + "/index.aspx")
writer.WriteEndElement()
writer.WriteStartElement("url")
writer.WriteElementString("loc", domain + "/aboutus.aspx")
writer.WriteEndElement()
... and so on....
答案 0 :(得分:2)
如果它是两倍大小,则一个是UTF-8(较小的一个),一个是UTF-16(较大的一个)。在UTF-16中,每个ASCII字符占用的空间是UTF-8的两倍。
(而Unicode意味着(在Windows中)UTF-16)。