- PR -

UTF-16でのテキスト出力

1
投稿者投稿内容
fruity
常連さん
会議室デビュー日: 2006/10/26
投稿数: 32
投稿日時: 2007-12-05 14:12
お世話になります。
StreamWriterでデータセットのUTF-16のテキストを出力したいです。
.net2003、oracle10gでWinアプリです

シフトJISではうまくいくのですが、
System.Text.Encoding.GetEncoding("UTF-16")を指定した時に
「プログラム名.odsAR+TABLERow」という文字が行の数分出てしまいます。

以下、ソース抜粋になります。

Dim writer As StreamWriter, reader As StreamReader

writer = New StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & strFileName1, False,System.Text.Encoding.GetEncoding("UTF-16"))

Dim RowCnt As Integer = odsAR.Tables("TABLE").Rows.Count

Dim Row As Integer
For Row = 0 To RowCnt - 1
writer.WriteLine(odsAR.Tables("TABLE").Rows(Row))
Next
writer.Close()

初歩的な事かもしれませんが、
宜しくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-12-05 14:49
引用:

System.Text.Encoding.GetEncoding("UTF-16")を指定した時に
「プログラム名.odsAR+TABLERow」という文字が行の数分出てしまいます
(snip)
writer.WriteLine(odsAR.Tables("TABLE").Rows(Row))


StreamWriter.WriteLine(DataRow)はないので、StreamWriter.WriteLine(Object)が適用されます。
StreamWriter.WriteLine(Object)(microsoft.com)より引用
引用:

オブジェクトで ToString を呼び出して、そのオブジェクトのテキスト形式をテキスト ストリームに書き込み、...


なので、UTF-16だろうが、S-JISだろうが、UTF-8だろうが出力される内容に違いは出ないはずです。
違いが出るということは、違いが出るような記述をしているからではありませんか?
(エンコーディングの指定以外に)

DataTableをどう構築したのか、またDataRowの実際の型が何かわかりませんが、以下のようなコード(VB.NETは分からないのでc#でご勘弁を)を実行してみましたが、同一の結果でした(エンコーディングは違うけれども)
コード:
using System.IO;
using System;
using System.Text;
using System.Data;

namespace IoTest {

public class Test {
	public static void Main() {
		StreamWriter sjisWriter = new StreamWriter(
			"out_sjis.txt", false, Encoding.GetEncoding(932)
		);
		
		StreamWriter utf16Writer = new StreamWriter(
			"out_utf16.txt", false, Encoding.GetEncoding("UTF-16")
		);
		
		DataTable table = new DataTable("table");
		table.Columns.Add(new DataColumn("id", typeof(int)));
		table.Columns.Add(new DataColumn("val", typeof(string)));

		for (int i = 1; i <= 64; ++i) {
			DataRow newRow = table.NewRow();
			newRow["id"] = i;
			newRow["val"] = string.Format("value={0}", i);
			
			table.Rows.Add(newRow);
		}
		
		foreach (DataRow row in table.Rows) {
			sjisWriter.WriteLine(row);
			utf16Writer.WriteLine(row);
		}
		
		sjisWriter.Close();
		utf16Writer.Close();
	}
}


}



[結果]
共にSystem.Data.Datarowが指定行数分出力
fruity
常連さん
会議室デビュー日: 2006/10/26
投稿数: 32
投稿日時: 2007-12-05 20:00
かずくんさん、
ありがとうございます。

コードの提供ありがとうございます。

補足ですが、
Oracleデータアダプターを使用しています。
System.Data.OracleClient.OracleDataAdapter

odsAR.Clear()
odaAR.Fill(odsAR)

おっしゃられるとおり、
エンコードの指定だけで違いが出ないと思い
調査したところ両方ともうまくいっていませんでした。

色々試行錯誤した結果、
ActiveReportのTextExportを使用して
Encode指定したところうまくいきました。

ありがとうございました。
1

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