読者です 読者をやめる 読者になる 読者になる

Get-Contentで文字コードを指定してファイルを読み込む

Windows PowerShell

JOSMで作成した地物データファイルをPowerShellで読み込もうとしたところエラーになってしまいました。

PS > $a = [xml](Get-Content .\基準点.xml)
値 "System.Object[]" を型 "System.Xml.XmlDocument" に変換できません。エラー: "'<' (16 進数値 0x3C)
は無効な属性文字です。 行 12、位置 5 です。"
発生場所 行:1 文字:11
+ $a = [xml] <<<< (Get-Content .\基準点.xml)
    + CategoryInfo          : NotSpecified: (:) []、RuntimeException
    + FullyQualifiedErrorId : RuntimeException

構造に問題があるのかと思ったけどInternetExplorerなどではエラーなく表示できるので問題ないはず。

xyzzyで「基準点.xml」を開いてみたところ文字コードが「utf8n」となっていました、BOMなしのUTF-8のようです。
BOMがないことによって文字コードの判別に失敗したPowerShellがエラーを起こした模様。

Get-Contentで読み込む際に文字コードを指定できれば解決しそうということで「-Encoding UTF8」を付けて実行してみたところうまく解釈してくれました。

PS > $a = [xml](Get-Content -Encoding UTF8 .\基準点.xml)

Get-HelpしてもGet-Contentに「-Encoding」のオプションなんて出てこなかったような気がするけどこれでイケました。

2014/04/24追記

////ココカラ
日本語ヘルプの入っていないPowerShellだと「-Encoding」のオプションが表示されるようです。
環境によってちょっと異なるようですね。
////ココマデ

2014/04/24さらに追記

////ココカラ
Windows8だと日本語でも「-Encoding」の説明が出てきました。
本文で実行した環境はWindows7だったのでその辺の違いもあるんですかね。
////ココマデ