tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDOMでXMLをUTF-8Nで保存する方法
記事No1844
投稿日: 2005/06/21(Tue) 16:28
投稿者くぅた
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

はじめて投稿させていただきます。
現在、VB.NETでXML文書を読み込み、編集して保存するクライアントシステムを構築しようとしていま
す。XMLは、DOMで操作しています。
読み込み→編集→保存、まではうまくできたのですが、元のXMLファイルは文字コードがUTF-8のBOMな
しで保存されており、(UTF-8Nというらしいんですが・・・)VBで変換して保存したものはBOMがつい
たUTF-8として保存されてしまいます。
他のWebシステムで使うXMLファイルなので、BOM付きに変わってしまうとそのシステムでは読み込みが
できなくなってしまうようです。
文字コードについて、Web上でいろいろと調べたのですが、UTF-8NでXML文書を保存する方法、または
UTF-8をUTF-8NにVBで変換する方法が見つからず、困っています。
どなたか、ご存知でしたらご教授いただけたら、と思います。よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: DOMでXMLをUTF-8Nで保存する方法
記事No1845
投稿日: 2005/06/21(Tue) 20:48
投稿者魔界の仮面弁士
泥臭い方法しか思いつきませんでした……。
もっとスマートな方法があるのかな。

'---------------
Dim UTF8Bin() As Byte

'元になるXML
Dim Doc As New Xml.XmlDocument()
Doc.LoadXml("<?xml version='1.0' encoding='UTF-8'?><くぅた />")

'バイト配列に取得
Dim DocBin As New IO.MemoryStream()
Doc.Save(DocBin)
UTF8Bin = DocBin.ToArray()
DocBin.Close()

'先頭に UTF-8 のBOMが含まれているか確認
Dim hasBOM As Boolean = True
Dim BOM() As Byte = System.Text.Encoding.UTF8.GetPreamble()
For Each B As Byte In BOM
    Dim P As Integer
    If UTF8Bin(P) <> B Then
        hasBOM = False
        Exit For
    Else
        P += 1
    End If
Next

'BOMが含まれていたら、取り除く
If hasBOM Then
    Dim UTF8N(UTF8Bin.GetUpperBound(0) - BOM.Length) As Byte
    Array.Copy(UTF8Bin, BOM.Length, UTF8N, 0, UTF8N.Length)
    UTF8Bin = UTF8N
    Erase UTF8N
End If

'確認のため、ファイルに出力
With New BinaryWriter(New FileStream("C:\UTF8.XML", FileMode.Create))
    .Write(UTF8Bin)
    .Close()
End With

[ツリー表示へ]
タイトルありがとうございました!
記事No1847
投稿日: 2005/06/22(Wed) 14:10
投稿者くぅた
[OSのVer]:Windows    [VBのVer]:VB.NET  

魔界の仮面弁士 様

早速の回答をありがとうございました!!
内容は難しくて、あんまり理解はできなかったのですが、ソースをコピーしてやってみたところ、
うまくいきました!!感激です〜!!

本当に、本当に、感謝しております。
ありがとうございました。

[ツリー表示へ]