tagCANDY CGI VBレスキュー(花ちゃん) - DOMでXMLをUTF-8Nで保存する方法(VB.NET) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
DOMでXMLをUTF-8Nで保存する方法(VB.NET)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

DOMでXMLをUTF-8Nで保存する方法(VB.NET) [No.150の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/26 16:30
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][]                                      *
* キーワード:文字コード,DOMで,XML,UTF-8N,,                                       *
***********************************************************************************

元質問:DOMでXMLをUTF-8Nで保存する方法 - くぅた  2005/06/21-16:28 No.1844

現在、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で保存する.. - 魔界の仮面弁士  2005/06/21-20:48 No.1845
-----------------------------------------------------------------------------------
泥臭い方法しか思いつきませんでした……。
もっとスマートな方法があるのかな。

'---------------
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

--------------------------------------------------------------------------------
ちょっと便利な検索ソフト(http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=117)
を使って、キーワード【UTF-8N BOM】での検索結果(当サイト内・外の検索でも同じ)

  ヒット件数    検索対象サイト名    検索結果のURL(短く変換しています)
          8,200 件  ■ウェブ全体から検索       http://tinyurl.com/5kueka
              2 件  ★VBレスキュー(花ちゃん)   http://tinyurl.com/5twh4c
              2 件  Programing Library         http://tinyurl.com/5k8zfy
              1 件  わんくま同盟               http://tinyurl.com/67cbvw
              1 件  ●msdn.microsoft.com/      http://tinyurl.com/6odyda
              0 件  DOBON.NET
--------------------------------------------------------------------------------
メンテ

Page: 1 |

DOMでXMLをUTF-8Nで保存する方法(VB.NET)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2008/11/05 16:31
名前: lightbox

***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][]                                      *
* キーワード:文字コード,DOMで,XML,UTF-8N,,                                       *
***********************************************************************************

Imports System.IO
Imports System.Text

Module MyModule

' ********************************************************
' * 実行
' ********************************************************
Sub Main()

    Dim Doc As New Xml.XmlDocument()

    Dim strData As String = _
        "<?xml version=""1.0"" encoding=""UTF-8""?>" + _
        "<data>" + _
        "<row>" + _
        "<col type=""氏名"">山田 太郎</col>" + _
        "<col type=""フリガナ"">ヤマダ タロウ</col>" + _
        "<col type=""NO"">1234567890</col>" + _
        "</row>" + _
        "</data>"

    Doc.LoadXml(strData)

    ' BOM あり
    Doc.Save( "mydata_bom.xml" )

    ' BOM 無し
    Dim utf8NoBOM As New UTF8Encoding()
    Dim xmlWriter As StreamWriter = New StreamWriter( "mydata.xml", False, utf8NoBOM )
    Doc.Save( xmlWriter )
    xmlWriter.Close()
    xmlWriter.Dispose()

End Sub

End Module
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ