- PR -

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

投稿者投稿内容
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-12-06 20:15
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>

HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-12-06 20:50
XmlTextReaderはデフォルトではutf-8で処理されるからではないでしょうか?




_________________
--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-12-06 20:51 ]
がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-12-06 20:53
がんふぃーるどです。お世話様です。

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



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

ちなみに、utf-8が正常に取り込めたのは、XmlTextReader.Encodingの規定値がutf-8だからですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 21:12
引用:

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

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


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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-12-06 22:37
引用:

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
まー実際読めてないわけで・・・
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-12-06 23:28
手元で簡単にテストした限り、XmlReaer.Create(Stream, XmlReaderSettings) はちゃんと encoding 宣言を見て使用するエンコーディングを決定していますね。
データのソースが MemoryStream なのが気になります。ちゃんと Shift_JIS なバイト列になっていますか?

[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-12-06 23:29 ]
がんふぃーるど
ベテラン
会議室デビュー日: 2006/06/05
投稿数: 58
お住まい・勤務地: さいたま
投稿日時: 2006-12-06 23:32
引用:
XmlTextReader.Encoding プロパティは、ReadOnly だったかと思いますが...


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

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

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

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

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

[ メッセージ編集済み 編集者: がんふぃーるど 編集日時 2006-12-07 00:24 ]
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-12-07 08:21
引用:

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#を中心とした技術ネ

スキルアップ/キャリアアップ(JOB@IT)