QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

[VB.NET2005+XML] XMLのencodingがShift_JISが読み込めない

XMLのencodingがShift_JISだとReaderで取り込めません。
utf-8だと問題なく取り込めます。(encoding以外中身は一緒)

文字コードの確認は秀丸で、エンコードの種類を確認しています。



Public Sub LoadXML(ByVal XMLStream As IO.MemoryStream)

    Dim settings As XmlReaderSettings = New XmlReaderSettings
    Dim Reader As XmlReader

    ' ファイル取り込み
    settings.ConformanceLevel = ConformanceLevel.Fragment
    settings.IgnoreWhitespace = True
    settings.IgnoreComments = True
    Reader = XmlTextReader.Create(XMLStream, settings)

    MsgBox("LoadXML")

    ' XML解析
    While Reader.Read
        If Reader.NodeType = XmlNodeType.Element Then
            Select Case Reader.Name
                Case "Application"
                    MsgBox("Shift_JISの時ここまでこない")
                    AppSetting(Reader)
            End Select
        End If
    End While
End Sub

・Shift_JIS



<?xml version="1.0" encoding="Shift_JIS"?>
<Application>
  <アイテム1>あいうえお</アイテム1>
  <どれみ>
    <アイテム2>かきくけこ</アイテム2>
    <ふぁそら>
      <アイテム3>さしすせそ</アイテム3>
      <しど>
        <アイテム4>たちつてと</アイテム4>
      </しど>
      <アイテム5>なにぬねの</アイテム5>
    </ふぁそら>
    <アイテム6>はひふへほ</アイテム6>
  </どれみ>
  <アイテム7>まみむめも</アイテム7>
</Application>

質問者:うきょきょ

回答

XmlTextReaderはデフォルトではutf-8で処理されるからではないでしょうか?


--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています
[ メッセージ編集済み 編集者: HIRO 編集日時 2006-12-06 20:51 ]

投稿者:HIRO

編集 履歴 (0)

がんふぃーるどです。お世話様です。

XMLのencodingがShift_JISだとReaderで取り込めません。

utf-8だと問題なく取り込めます。(encoding以外中身は一緒)

XMLパーサは<?xml ... encoding=... ?>の文字エンコードを指定している部分を見て
くれません。文字エンコーディングの指定はXmlTextReader.Encodingで直接行う必要
があります。(意外に不便)
なので、指定してあげましょう。(テキストリーダを挟んだりしてもいいです)

ちなみに、utf-8が正常に取り込めたのは、XmlTextReader.Encodingの規定値がutf-8だからですね。

投稿者:がんふぃーるど

編集 履歴 (0)

がんふぃーるどさんの書き込み (2006-12-06 20:53) より:

文字エンコーディングの指定はXmlTextReader.Encodingで直接行う必要があります。(意外に不便)

XmlTextReader.Encoding プロパティは、ReadOnly だったかと思いますが...

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

XMLパーサは<?xml ... encoding=... ?>の文字エンコードを指定している部分を見て

くれません。文字エンコーディングの指定はXmlTextReader.Encodingで直接行う必要

があります。(意外に不便)

やっぱ見てくれないのですね。うーむ。

XmlTextReader.Encoding プロパティは、ReadOnly だったかと思いますが...

ですです。ReadOnlyなので、どーしたもんかと。
XmlTextReader.Createにエンコード指定もないし。

http://msdn2.microsoft.com/ja-jp/library/system.xml.xmltextreader.encoding(VS.80).aspx

XmlTextReader は System.Text.Encoding クラスを使用するため、XmlTextReader もこのクラスがサポートするすべてのエンコーディングをサポートします。なお、UTF-7 や EBCDIC など、<?xml シーケンスを UTF-8 と異なるバイト値に割り当てるエンコーディングについては例外となります。

とは書いてあるけどサポートするのか、例外なのか読み取れないorz
まー実際読めてないわけで・・・

投稿者:うきょきょ

編集 履歴 (0)

手元で簡単にテストした限り、XmlReaer.Create(Stream, XmlReaderSettings) はちゃんと encoding 宣言を見て使用するエンコーディングを決定していますね。
データのソースが MemoryStream なのが気になります。ちゃんと Shift_JIS なバイト列になっていますか?
[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-12-06 23:29 ]

投稿者:Hongliang

編集 履歴 (0)

XmlTextReader.Encoding プロパティは、ReadOnly だったかと思いますが...

ぎゃっ。リードオンリーでしたか。確認してませんでした。申し訳ありません(>_<)

ストリームを直接XMLリーダに渡すのでは無く、ストリーム→テキストリーダ(文字エンコード指定したもの)→XMLリーダって感じですね。

お手数おかけしました。(>▽<;; アセアセ

[訂正]
再三にわたる訂正申し訳ありません。.NET2.0ではXmlReader.Createメソッドで文字エンコーディングの特定を行っておりました。
ですので、Hongliangさんの言うとおり、本当にshift-jisのコードで読み込みが行われているかチェックするのが良いです。(またはファイルが本当にshift-jisコードになっているか)

[ メッセージ編集済み 編集者: がんふぃーるど 編集日時 2006-12-06 23:34 ]
[ メッセージ編集済み 編集者: がんふぃーるど 編集日時 2006-12-07 00:24 ]

投稿者:がんふぃーるど

編集 履歴 (0)

Hongliangさんの書き込み (2006-12-06 23:28) より:

手元で簡単にテストした限り、XmlReaer.Create(Stream, XmlReaderSettings) はちゃんと encoding 宣言を見て使用するエンコーディングを決定していますね。

私も自分の環境で試してみました。(MemoryStreamは使用せずパスを指定しました)
Hongliangさんの仰るとおり、encoding宣言を見て、使用するエンコーディングを決定するようですね。
MsgBoxのところまで問題なく実行できました。

自分の書き込み

XmlTextReaderはデフォルトではutf-8で処理されるからではないでしょうか?

上記訂正いたします

_________________--------------------------------------------
*HIRO's.NET **PowerShell,VB.NET,C#のTipsを掲載しています
*
HIRO's.NET Blog **PowerShell,VB.NET,C#を中心とした技術ネ

投稿者:HIRO

編集 履歴 (0)

すみませんでした。

MemoryStream格納時に文字コード変換をしていたみたいです。
呼び出し側を修正してもらうことで、動作することを確認しました。

お世話かけました。

投稿者:うきょきょ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。