@IT会議室は、2009年4月15日に新システムに移行し、さらに2012年5月29日にITエンジニアに特化した
質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用くださいませ。
- PR -

VB.NET FilePut関数の文字コードに関して

1
投稿者投稿内容
キンタロス
常連さん
会議室デビュー日: 2008/01/16
投稿数: 20
投稿日時: 2008-08-25 15:49
御世話になっております。キンタロスです。

今回、VB.NETでバッチファイル(正確にはexeをBATファイルでキック)を作成しております。
処理の中でFilePut関数を使用してCSV(TAB区切り)ファイルを作成しているのですが、
その際の文字コードが不明で投稿してみました。
FilePut関数を調べてみたのですが特に文字コードを指定するような仕様では無かった為、
実際には文字コードは何で作成されているのか疑問です。(デフォルトはUTF-8という方もいましたが・・・)
今回の仕様としてはファイル出力はS-JISで出力する様になっており困っています。

以下はソースです。

---------------------------------------------------------------------------
省略

inFileNo = FreeFile()

'ファイル オープン
FileOpen(inFileNo, pstEXPFile, OpenMode.Binary, OpenAccess.Write, OpenShare.LockWrite)

Do While DR.Read
stCSV = DR.Item(0)

For inIX = 1 To DR.FieldCount - 1
stCSV = stCSV & vbTab
stCSV = stCSV & DR.Item(inIX)
Next

stCSV = stCSV & vbCrLf

FilePut(inFileNo, stCSV)

'件数カウント
mlnCount = mlnCount + 1
Loop

'ファイル クローズ
FileClose(inFileNo)

'データリーダー クローズ
DR.Close()

DR = Nothing

---------------------------------------------------------------------------
FilePut関数でS-JISで出力というのは可能でしょうか?

宜しくお願い致します。
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-08-25 21:57
FilePutで出力しないとダメなのでしょうか。
StreamWriterクラスなら文字コードは指定できます。

http://msdn.microsoft.com/ja-jp/library/system.io.streamwriter(VS.80).aspx
キンタロス
常連さん
会議室デビュー日: 2008/01/16
投稿数: 20
投稿日時: 2008-08-26 12:10
もん吉さん
どうも有難う御座います。
StreamWriterクラスを使用して解決致しました。
キンタロス
常連さん
会議室デビュー日: 2008/01/16
投稿数: 20
投稿日時: 2008-08-27 09:58
解決したつもりでいましたが、問題が発生しました。

ファイル出力は行えるのですが、
全てのデータが出力されていないようです。
(確認すると最終行は出力されていない。その前のレコードはデータの途中で切れている)

---------------------------------------------
Do While DR.Read
stCSV = DR.Item(0)

For inIX = 1 To DR.FieldCount - 1
stCSV = stCSV & vbTab
stCSV = stCSV & DR.Item(inIX)
Next

stCSV = stCSV & vbCrLf

sw.WriteLine(stCSV)
Loop
---------------------------------------------

特に件数でどうこうする処理は入れていないので、
最終行とその前のレコードだけ出力しないなんて事はないと思うのですが。。。

StreamWriterで一回の処理内で扱える最大の容量なんて物があるのでしょうか?
どうもファイルの容量からすると119KB前後でおかしくなっているようです。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2008-08-27 12:44
処理が終わった後、StreamWriterのCloseは実行していますか?
キンタロス
常連さん
会議室デビュー日: 2008/01/16
投稿数: 20
投稿日時: 2008-08-27 14:53
GENZOさん
すみません・・・漏れていました・・・
StreamWriterのCloseを追加した所、正常に出力されました。
有難う御座います。
しかしまたまた問題が・・・
今回、S-JISで出力していますが、既存のデータに"鑫"という文字が入っています。
この"鑫"をS-JISで出力すると元々はユニコードなので当たり前ですが"?"となってしまいます。
バイナリデータで確認してもアスキーコードの"3F"(?のコード)となっています。
StreamWriterで出力した際にユニコードデータは"?"に変換されてしまうのでしょうか?
Tram
常連さん
会議室デビュー日: 2002/10/10
投稿数: 21
お住まい・勤務地: 横浜
投稿日時: 2008-08-27 17:01
Unicodeの"鑫"に対応するコードがShift-JIS(正確にはCP932)に存在しないため
変換に失敗しているのだと思います。
UnicodeとShift-JISとの変換はCP932変換テーブルを元に行われているかと思いますが、
その変換テーブルに存在しないコードは正しく変換できません。
キンタロス
常連さん
会議室デビュー日: 2008/01/16
投稿数: 20
投稿日時: 2008-08-27 18:47
Tramさん
どうも有難う御座います。
やはり無理そうですね・・・
先方はS-JISでファイルを作成してくれと言っているので、
文字化けする事を伝えて文字化けしたままとします。

有難う御座いました。
1

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

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