WSHで文字コード変換してファイルに保存するには?

解決


けせらんぱせらん  2007-01-16 22:33:43  No: 134853

WSHで、utf-8のテキストをutf-8形式、またはshift-jis形式でファイルに保存するバッチプログラムを作成しています。
いくつかの過去ログを参考に、ADODB.Streamを使ってコード変換をしてみましたが、作成されたテキストファイルの文字が化けてしまいます。
Charsetプロパティに、"utf-8"、または"shift-jis"をすると下記のようなコードになります。

"あいうえお"[E38182][E38184][E38186][E38188][E3818A]
<utf-8変換時>
E7 B8 BA E3 82 85 EF BC 9E E7 B8 BA E3 83 BB E2 
88 B4 E7 B8 BA E7 BF AB C2 B0 E7 B8 BA E9 98 AA 
EF BF A5 E7 B8 BA E4 BB A3 EF BC 85
<shift-jis変換時>
E3 81 82 E3 81 84 E3 81 81 45 81 88 E3 81 8A E3 
81 8B E3 81 8D E3 81 8F E3 81 91 E3 81 93

参考までに、ソースコードを以下に示します。
試しに、同じ関数をaspとして実行するとうまくいきます。ただ、実現したいのはバッチプログラムなので困っています。
どなたかアドバイスをいただけないでしょうか?
-----
Function convToFile(text, charset, filename)
  Dim objSTM
  Set objSTM = CreateObject("ADODB.Stream")
  objSTM.Type = adTypeText
  objSTM.Charset = charset
  objSTM.Open
  objSTM.WriteText text, 1
  objSTM.SaveToFile filename, 1
  objSTM.Close
  Set objSTM = Nothing
End Function
-----


魔界の仮面弁士  2007-01-16 23:32:07  No: 134854

Function にする意味は無いでしょう。Sub で良いですよね。

それはともかく、変換時にデータが化けてしまう場合には、
  1. 元データがそもそも破損している。
  2. 元データを読み込むときに破損させてしまった。
  3. データの変換処理に問題があった。
  4. 変換はできたが、それをファイル化する際に破損した。
  5. 変換は成功したが、その確認方法に問題がある。
などのパターンがあります。

変換処理自体は、特に問題は無さそうです。
  Call convToFile("あいうえお", "UTF-8", "C:\Sample.txt")
を実行すると、ただしく
  EF BB BF E3 81 82 E3 81   84 E3 81 86 E3 81 88 E3
  81 8A 0D 0A
というバイナリを得ることができましたので。

また今回は、バイナリでのチェックもしていますので、5. も無さそうです。

となると、1 および 2 の部分が問題になってきます。
ここの状況如何では、変換自体が不可能だったり、あるいは、変換処理に
手を加える必要が出てくるからです。

-----
まず、元データとなる『utf-8のテキスト』を、どこから得ているのかを教えてください。
ファイルから読みこんでいるなら、Stream.LoadFromFile で、ストリームへ
直接ロードできますので、データを破損させずに、UTF-8 のデータを得られるでしょう。

もし、「既に化けた結果」な文字列を渡していたり、ChrB 関数等で
UTF-8 な文字列を生成したりしようとしていたのであれば、その時点で
データが破損する可能性がありますので、結果は保証できません。

そして、入力データが破損していない事を保証できるようであれば、次に、
convToFile() 自作メソッドの第一引数に指定した text が、MsgBox や
WScript.StdOut.WriteLine などで表示可能な、正しい「文字列」に
なっている事を確認してください。

MsgBox に渡すと化けてしまう場合、Stream.WriteText は使用できません。
ストリームを バイナリモードにして、Stream.Write で書き込み、それを
別の文字コードの Stream に複写するという作業が必要です。
ただしこの場合、VBScript はバイト配列型を作成できませんので、バイナリを
得るために、何らかの ActiveX コンポーネントの手助けが必要となる事があります。


けせらんぱせらん  2007-01-17 01:13:39  No: 134855

魔界の仮面弁士 様、ご回答いただきありがとうございます。

>まず、元データとなる『utf-8のテキスト』を、どこから得ているのか
>を教えてください。

今は、テストなので関数が書かれた同じvbsファイルに呼び出し記述を書いています。呼び出し記述は魔界の仮面弁士 様と同様、引数に文字列を指定しています。
こんな感じです。
---
Call convToFile("あいうえお", "UTF-8", "C:\Sample.txt")
Sub convToFile(...)
...
End Sub
---
ただ、このファイルはutf-8で保存されています。
vbsファイルをshift-jisで保存した場合、utf-8 およびshift-jisともうまく変換できました。
このへんに問題があるのでしょうか。
ただ、vbsファイルの保存形式は要件なので、何か回避策等の情報があればご教示願います。


スクリプトプログラマ  2007-01-17 01:56:03  No: 134856

vbsファイルはutf-8に出来ましたっけ?
unicode little endianぐらいでしょ。
要件が無理なのでは?


魔界の仮面弁士  2007-01-17 05:18:29  No: 134857

手軽なところでは、*.vbs ではなく、*.wsf あたりにするのが楽でしょう。
これなら、Shift_JIS 以外の文字コードも直接扱えますし、エクスプローラから
直接ダブルクリックしても動きますし、WScript.exe や CScript.exe でも実行できます。
http://www.vb-user.net/junk/replySamples/2007.01.16.20.09/Sample.zip

どうしても *.vbs で無ければいけないのであれば、
  案1) ファイル中に埋め込む UTF-8 データは、16進数表現などで記述し、
    それを事前にデコードして文字列化する。
  案2) 文字列を vbs 中に埋め込まず、外部ファイル等から渡す仕様にする。
  案3) *.vbs を直接 WScript.exe や CScript.exe で実行させるのではなく、
    文字コードを指定可能な実行ホスト(HTA, WSC, ASP, MSScript 等)を利用する。
といったところでしょうか。


けせらんぱせらん  2007-01-17 22:20:04  No: 134858

スクリプトプログラマ 様、魔界の仮面弁士 様、ご回答ありがとう
ございます。
返事が遅くなりまして申し訳ありません。

結論から言いますと、魔界の仮面弁士 様からご助言頂いた
「wsfファイル化」とすることで、utf-8 およびshift-jisへの
変換出力がうまくできました。
サンプルコードまでいただきまして本当にありがとうございました。

なお、要件の見直しも念頭に、スクリプトプログラマ 様から頂いた
情報について、MSサイトやインターネットを検索しましたが、
残念ながら見つけることができませんでした。
探し方が悪かったかもしれません。

情報をお寄せ頂いた、スクリプトプログラマ 様、魔界の仮面弁士 様には改めてお礼を申し上げます。


スクリプトプログラマ  2007-01-18 00:59:37  No: 134859

検索ではなく、
例えば、
MsgBox "あいうえお"
だけのコードをUTF-8で保存して実行させてみれば、
VBSファイルがUTF-8に対応していないことが検証できます。


魔界の仮面弁士  2007-01-18 06:12:43  No: 134860

> 「wsfファイル化」とすることで、
ただし『ファイルサイズが 524,288 バイトを超えてはならない』という
制限がありますので、その点はご注意あれ。

> VBSファイルがUTF-8に対応していないことが
蛇足までに補足しておくと、VBScript 対応の実行環境すべてが、
UTF-8 形式のファイルを利用できないというわけではありません。

たとえば HTA では、
  <script type="text/vbscript" charset="UTF-8" src="UTF8.VBS"></script>
を使う事で、UTF-8 テキストで保存された VBS ファイルを処理できますね。


スクリプトプログラマ  2007-01-18 06:55:29  No: 134861

:-<
ファイルタイプのVBSファイルのことです。WSHの。

>  <script type="text/vbscript" charset="UTF-8" src="UTF8.VBS"></script>
>を使う事で、UTF-8 テキストで保存された VBS ファイルを処理できますね。
それは拡張子がたまたまVBSなだけで、VBSファイルとは関係のないVBScriptのファイル。


スクリプトプログラマ  2007-01-18 07:40:41  No: 134862

WSFなら、
<script language="vbscript" charset="utf-8" src="utf8"></script>
を使うことで、UTF-8で保存したWSHのVBScriptのファイルをインクルードできますね。


魔界の仮面弁士  2007-01-18 09:16:49  No: 134863

> :-<
お気を悪くされたのならすみません。揚げ足を取ったつもりではなく、
1) *.vbs というファイルを処理できるのは、WScript/CScriptだけではない。
2) UTF-8 テキストのVBScriptを直接読める処理系もある。
という点を補足したかっただけです。m(_ _)m

> それは拡張子がたまたまVBSなだけで、VBSファイルとは関係のないVBScriptのファイル。
この部分について、もう少し砕いて教えてください。

最初の「拡張子がたまたまVBSなだけ」という点と、最後の
「VBScriptのファイル」という点についてはわかるのですが、
間にある「VBSファイル」というのがわかりませんでした。
ここでいう VBS ファイルの定義とは、どのようなものなのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加