- ベストアンサー
UTF-8に設定したい。ファイルの文字コード変更方法を教えてください。
- XMLファイルとスタイルシート(.xslt)を使用して新しいファイルを作成するコードがあります。現在、CreateTextFileメソッドで作成されるファイルの文字コードはUnicodeです。UTF-8に変更する方法はありますか?
- 初心者レベルで、UTF-8に設定する方法を知りたいです。現在はUnicodeで出力されています。
- XMLファイルとスタイルシートを使用して新しいファイルを作成するコードがありますが、作成されるファイルの文字コードをUTF-8に変更したいです。方法を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>これは.NETでXMLとXSLTを使用してtxtファイルをはき出すプログラムを作成するということでしょうか? そうです。 .NET Framworkが使えれば JScript.NETが使えます。 そうすると、.NETのライブラリが使えて、jsファイルをコンパイルして実行可能ファイル(EXE)を作成できます。 例えば、 conv.jsという名前で以下の部分を作成したとします。 //-------------------------------------------------------------- import System; import System.IO; import System.Text; function convert( XMLParam, XSLTParam, destParam ){ var objData=new ActiveXObject("Msxml2.DOMDocument"); objData.async = false; objData.load(XMLParam); var objStyle=new ActiveXObject("Msxml2.DOMDocument"); objStyle.async = false; objStyle.load(XSLTParam); var Fs : FileStream = new FileStream(destParam, FileMode.Create, FileAccess.Write, FileShare.None); var fswUTF8 : StreamWriter = new StreamWriter(Fs, System.Text.Encoding.UTF8); fswUTF8.WriteLine(objData.transformNode( objStyle)); fswUTF8.Close(); } convert("test.xml","test.xsl","utf8.txt"); //------------------------------------------------------------- これは、test.xmlにtest.xslを適用したモノをUTF-8文字コードをつかって、utf8.txtという名前で、出力します。 コマンドプロンプトから jsc conv.js でそのままコンパイルできて、conv.exeができたら、 conv.exeを実行できます。 >拡張子.jsのファイルを.NETFrameworkを参照して作成するということ。。? エディタがあれば作成できます。jsファイルはただのテキストですので。 環境として.NETFrameworkがインストールされている必要があるということです。
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>.NET2003 が入っているなら import System; import System.IO; import System.Text; var Fs : FileStream = new FileStream(destParam, FileMode.Create, FileAccess.Write, FileShare.None); var fswUTF8 : StreamWriter = new StreamWriter(Fs, System.Text.Encoding.UTF8); fswUTF8.Write(objData.transformNode( objStyle )); fswUTF8.Close(); って感じでUTF8出力できます。 ファイルがconv.jsだったら jsc conv.js としてコンパイルして下さい。
お礼
ご回答ありがとうございます。 すみません。 少し理解が追い付かないのですが、 これは.NETでXMLとXSLTを使用してtxtファイルをはき出すプログラムを作成するということでしょうか? 拡張子.jsのファイルを.NETFrameworkを参照して作成するということ。。? ですよね。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>出力されなくなりました。。 すみません、なんだか、XSLをXML→XMLだと思い込んでいました。 出力が普通のテキストなら transformNodeでの変換結果を loadXMLで読込したら中身が無くなるのは当たり前ですね。m(_ _)m saveもできるわけないです。 通常のMSXMLとJScriptの範囲ではできないですね。 反ってお手数掛けさせてすみません。<(_ _)> ところで、.NET Frameworkはインストールされていますでしょうか? もしそうなら、.NET Frameworkのライブラリを使ってUTF-8出力できるかもしれません。
お礼
ご回答ありがとうございます。 私の説明不足でこちらこそお手数をおかけしました。 自宅のPCには.NETはインストール済みなのですが、 一応会社のマシンの.NET2003であわせたいので、 また明日会社でいろいろやってみます。 ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>いまいちよくわからないので・ スタイルシートで、 <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" version="1.0"/> の様にxsl:outputで omit-xml-declaration="yes" を指定すれば、XMLの宣言を無くす(出力しない)ことができます。 XML宣言のないXML文書はUTF-8を使うということなので、UTF-8で書き出しされるということになります。 適用されるスタイルシートを変更できないような場合、 上記宣言を取り除いてコピーするようなスタイルシートをさらに適用するというような形になるかと思います。 * #3は、ちょっと言葉が足りないと自分でも思います。 でも、実際、どのように文書を扱っておられるかわからないので、抽象的になるのはしょうがないです。 もし、問題なければ、XML文書、XSLT文書を補足していただくと、こちらでも動作確認した上で、具体的なソースを示せるかと思います。
お礼
度々ありがとうございます。 やっとコンパイルエラーがなくなった。。 と思ったら、出力されなくなりました。。 fso = WScript.CreateObject("Scripting.FileSystemObject"); fl = fso.CreateTextFile( destParam, true, true ); fl.Write(objData.transformNode( objStyle )); fl.Close(); の部分を、見よう見まねで、 conv = new ActiveXObject("Msxml2.DOMDocument.3.0"); conv.async = false; conv.loadXML(objData.transformNode( objStyle)); conv.save(destParam); と変えてみたのですが、、 何がダメなのかもう少し調べてみます。。 ありがとうございました。
補足
XMLとXSLTを公開するのは私の一存では決めかねることなので、できませんが、 ヘッダ部分?は以下のようになっています。 XML ----------------------------- <?xml version="1.0" encoding="utf-8" ?> <entries> 以下内容が書かれています。。 XSLT ----------------------------- <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="UTF-8" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:apply-templates select="entries"/> </xsl:template> <xsl:template match="entries"> 以下内容が続きます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
一応裏技的(?)にできるのがわかりました。 ar conv = new ActiveXObject("Msxml2.DOMDocument.3.0"); conv.async = false; conv.loadXML("<?xml version=\"1.0\"?>"+objData.transformNode( objStyle)); conv.save(destParam); みたいな感じで、encoding指定無しでsaveメソッドを使うとUTF-8で出力されます。 saveで出力すればFSOによる書き出しは不要になります。
お礼
遅くなりました。 ご回答ありがとうございます。 現在教えていただいたコードを埋め込みながら 実験のように行っているのですが、、 (いまいちよくわからないので・・) JavaScriptのコンパイルエラーが出てしまってf^_^; 色々調べてやって見ます。 ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1です。 XSLTの規格的には、 xsl:output encoding="UTF-8" 出力できるはずですが どうもMSXMLでは、指定を無視するようです。(文字コード実際になんでもUTF-16だと宣言を出力する) なので、#1の方法ではできないですね;;
お礼
ご回答ありがとうございます。 スタイルシートを眺めていた結果、 output encoding= を見つけていたのでUTF-8を指定してやってみた結果、うまくいかず、、 だとするとJavaScriptでするしかないのか? と思って色々試行錯誤をわからないなりにしてみてはいるのですが・・・ やっぱりできないんですかね。。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
スタイルシートで出力が作成されていますから スタイルシートで、出力の文字エンコーディングを指定する必要があります。 スタイルシートで <xsl:output method="xml" encoding="UTF-8" /> とか指定してやれば良いように思います。 スタイルシートが変更できないのであれば手作業みたいな作業をせざるを得ないような気がします。
お礼
ご回答ありがとうございます。 No2のお礼欄にまとめて書かせていただきます。m-_-m
お礼
ご回答ありがとうございます。 サンプルコードまで記述いただき、とても参考になりました。 なんとかUTF8で出力できるようになりました。 今回のことでJScript.NETというものの存在を初めて知りました。 (恥ずかしい話です。。) 今後チョコチョコ勉強していきたいと思います。 ありがとうございました。