C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 複数の文字コードでファイルを作成するには


(過去ログ 53 を表示中)

[トピック内 25 記事 (1 - 20 表示)]  << 0 | 1 >>

■29762 / inTopicNo.1)  複数の文字コードでファイルを作成するには
  
□投稿者/ TTT (1回)-(2008/12/13(Sat) 21:13:39)

分類:[C#] 

2008/12/13(Sat) 22:01:59 編集(投稿者)
2008/12/13(Sat) 22:01:55 編集(投稿者)

C#にてプログラムを作成しています。
もとのデータはS-JISで、そのデータを取得し
そのままの項目とJISに変換する項目を混在させて
固定長のバイナリファイルを作成したいと思っています。
例:
行項目1項目2項目3
1aaabbbccc
2aaabbbccc
3aaabbbccc

aaa:S-JIS
bbb:JIS
ccc:S-JIS

S-JIS⇒JISへの変換は
文字列(S-JIS)⇒バイト列(S-JIS)⇒バイト列(JIS)⇒文字列(JIS)
で行っていましてその後、StreamWriterでS-JISでエンコードしてファイルを
作成しています。
"StreamWriterでS-JISでエンコード"がダメなのか最終的に作成したファイルは
すべての項目がS-JISで作成しているように思えます。

まず、例で示したようなファイルを作成することは可能なのでしょうか。
アドバイスをいただきたいと思っています。
よろしくお願いします。



引用返信 編集キー/
■29764 / inTopicNo.2)  Re[1]: 複数の文字コードでファイルを作成するには
□投稿者/ よねKEN (231回)-(2008/12/13(Sat) 21:58:31)
No29762 (TTT さん) に返信
> C#にてプログラムを作成しています。
> もとのデータはS-JISで、そのデータを取得し
> そのままの項目とJISに変換する項目を混在させて
> 固定長のバイナリファイルを作成したいと思っています。

元データはSJISとのことなので、読み込みはStreamReaderでよいですが、
バイナリファイルを作成するために、書き込みはBinaryWriterを使いましょう。

> S-JIS⇒JISへの変換は
> 文字列(S-JIS)⇒バイナリ列(S-JIS)⇒バイナリ列(JIS)⇒文字列(JIS)

読み込んだデータは内部文字コードUNICODEのStringです。
Encoding.GetEncoding("Shift_JIS").GetBytes(SJIS部分の文字列)
でShift_JIS部分の文字列からバイトデータを取得し、
Encoding.GetEncoding("iso-2022-jp").GetBytes(JIS部分の文字列)
でJIS部分の文字列からバイトデータを取得します。

引用返信 編集キー/
■29765 / inTopicNo.3)  Re[2]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (2回)-(2008/12/13(Sat) 22:12:59)
何点か間違いがありました。

>文字列(S-JIS)⇒バイナリ列(S-JIS)⇒バイナリ列(JIS)⇒文字列(JIS)
文字列(S-JIS)⇒バイト列(S-JIS)⇒バイト列(JIS)⇒文字列(JIS)

StringBuilderに入れているのですが、それは問題ありますか?

書いていることの意味が分からなければすみません。。。。
引用返信 編集キー/
■29766 / inTopicNo.4)  Re[3]: 複数の文字コードでファイルを作成するには
□投稿者/ よねKEN (232回)-(2008/12/13(Sat) 22:56:41)
No29765 (TTT さん) に返信
> 何点か間違いがありました。
>
> >文字列(S-JIS)⇒バイナリ列(S-JIS)⇒バイナリ列(JIS)⇒文字列(JIS)
> 文字列(S-JIS)⇒バイト列(S-JIS)⇒バイト列(JIS)⇒文字列(JIS)
>
> StringBuilderに入れているのですが、それは問題ありますか?

何をStringBuilderに入れているのですか?

> 書いていることの意味が分からなければすみません。。。。

変換処理をしている箇所のコードを提示してはどうですか。

引用返信 編集キー/
■29769 / inTopicNo.5)  Re[4]: 複数の文字コードでファイルを作成するには
□投稿者/ Azulean (241回)-(2008/12/14(Sun) 00:49:45)
・StringBuilder、stringはUnicodeで扱うことが前提です。
・ひょっとして、GetBytesやった後にGetStringしていませんか?
 GetBytes:Unicodeの文字列(string)を対象のエンコードでのバイト列に変換する。
 GetString:対象のエンコードでのバイト列をUnicodeの文字列(string)に変換する。
・StreamWriterでEncodingを指定した場合、Unicodeの文字列(string)からそのエンコードに変換して出力されます。


想像した現状の動作:(間違っていたらすみません)
1.JISとするべき文字列をGetBytesする。
2.JISになったByte配列をStringBuilderに追加するため、GetStringしている。(Unicodeに戻っている)
3.StreamWriterでShiftJISに変換している。
4.結果として得られるものは、全てShiftJISの文字列になっている。
引用返信 編集キー/
■29770 / inTopicNo.6)  Re[5]: 複数の文字コードでファイルを作成するには
□投稿者/ Azulean (242回)-(2008/12/14(Sun) 00:52:32)
リンクしておきます。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=23584&rev=&no=0
引用返信 編集キー/
■29774 / inTopicNo.7)  Re[6]: 複数の文字コードでファイルを作成するには
□投稿者/ マルチポスト (1回)-(2008/12/14(Sun) 12:59:04)
自分の問題さえ解決できれば回答者の労力なんて・・・
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47608&forum=7
引用返信 編集キー/
■29789 / inTopicNo.8)  Re[7]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (3回)-(2008/12/14(Sun) 22:06:09)
すみません。今後気を付けます。
ほかは削除しておきます。
引用返信 編集キー/
■29791 / inTopicNo.9)  Re[5]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (4回)-(2008/12/14(Sun) 22:45:50)
> ・StreamWriterでEncodingを指定した場合、Unicodeの文字列(string)からそのエンコードに変換して出力されます。
>
> 想像した現状の動作:(間違っていたらすみません)
> 1.JISとするべき文字列をGetBytesする。
> 2.JISになったByte配列をStringBuilderに追加するため、GetStringしている。(Unicodeに戻っている)
> 3.StreamWriterでShiftJISに変換している。
> 4.結果として得られるものは、全てShiftJISの文字列になっている。

記載していただいてる流れになっていたと思います。
(今、手元にありません。)
StringBuilderを使用することがダメということなんですね。
どのように対処してよいかがあまりわかっていません。

参考になるページなどがあれば教えていただければ幸いです、





引用返信 編集キー/
■29792 / inTopicNo.10)  Re[6]: 複数の文字コードでファイルを作成するには
□投稿者/ Azulean (243回)-(2008/12/14(Sun) 23:16:10)
よねKENさんがNo.29764で方法を書いています。
StreamWriterを使わず、byte単位でBinaryWriterで書くと、文字コードを混在させることができるでしょう。
(stringとして扱うのではなく、byte配列として扱う)

異なるエンコードを持つファイルを作るにはバイナリとして書き込むしか手だてはなさそうです。




なお、どぼんさんのところのマルチポストルールに引っかかっていますが、その場で解決済みをつけることはさらなるルール違反になっています。
マルチポスト先には、経過報告や最終結果報告等の形で、フィードバックを心がけましょう。
引用返信 編集キー/
■29796 / inTopicNo.11)  Re[7]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (5回)-(2008/12/15(Mon) 11:11:22)
2008/12/15(Mon) 11:27:34 編集(投稿者)

なかなか理解できなくてすみません。

System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("Shift-JIS");
StringBuilder sb = new StringBuilder();


Response.BinaryWrite(encoding.GetBytes(sb.ToString()));

上記のような記述をしているのですがその場合は、必ずShift-JIS形式で
出力されますよね。
StringBuilderにセットするタイミングでJISへの変換を行っているのですが
それはまったくの間違えということになりますよね。
StringBuilderに一旦セットして行うこと自体が間違えということになると
1行づつデータ取得してファイルに書き込んでいくという方法になるのでしょうか。

>固定長のバイナリファイルを作成したいと思っています。
と記載しましたが、テキストファイルの間違いです。
重要なとこを間違えていました。
JIS変換した項目(漢字設定項目)のみが文字化けしているような
状態のファイルを作成したいと思っています。

同じような質問ですみませんが、お願いします。
引用返信 編集キー/
■29812 / inTopicNo.12)  Re[8]: 複数の文字コードでファイルを作成するには
□投稿者/ よねKEN (234回)-(2008/12/15(Mon) 13:09:22)
> Response.BinaryWrite(encoding.GetBytes(sb.ToString()));

Response.BinaryWriteってことはひょっとしてWebアプリですか?

> 1行づつデータ取得してファイルに書き込んでいくという方法になるのでしょうか。

そうですね。1行ずつ、SJISとしてのバイト列、または、JISとしてのバイト列に変換して、
バイナリとして書き出します。

Httpへのレスポンスに返す話ならResponse.BianryWriteかもしれませんが(ASP.NETは詳しくないのでこの辺は自信なし)、
ファイルに書き込みたいのであれば、BinaryWriter(System.IO名前空間)を使って書き出します。

> >固定長のバイナリファイルを作成したいと思っています。
> と記載しましたが、テキストファイルの間違いです。
> 重要なとこを間違えていました。

いえ、バイナリファイルであってます。複数の文字コードが混在しているファイルのことを
一般的にはテキストファイルとはいいません。

引用返信 編集キー/
■29816 / inTopicNo.13)  Re[8]: 複数の文字コードでファイルを作成するには
□投稿者/ .SHO (412回)-(2008/12/15(Mon) 14:29:34)
No29796 (TTT さん) に返信

話をわざわざややこしくして混乱しているだけのように思えます。

まずは単純に
string (UNICODE)から、S-JISのバイナリファイルを作るのと
string (UNICODE)から、JISのバイナリファイルを作る処理を
完成させてはどうでしょう?

それが動けば、変換させたい方の処理を通すだけですよね。

引用返信 編集キー/
■29817 / inTopicNo.14)  Re[9]: 複数の文字コードでファイルを作成するには
□投稿者/ ま (175回)-(2008/12/15(Mon) 15:59:57)
No29816 (.SHO さん) に返信
> ■No29796 (TTT さん) に返信
> 
> 話をわざわざややこしくして混乱しているだけのように思えます。

同感です。

もっと単純に、
 SJISは2バイト1セット
 JISも漢字なら2バイト1セット
です。
SO/SI考慮する必要無いのであれば、

SJIS文字列を
JIS文字列に変換して
バイナリファイルに書く

上記3行で1行とするSJISデータがあるとき、
バイナリリーダーで読み込み開始します。
byte[2] 配列を用意して、1文字分ずつデータを読みます。
「JIS文字列に変換して」部分だけJISに変換するので
配列に読んだら、変換るーちん通した結果をバイナリライター
のファイルにかきこんであげるだけですね。

http://www.slayers.ne.jp/~oouchi/code/sjistojis.html
SJIS−>JIS 変換るーちん C言語版

2バイト1文字として読み込むので、半角全角混在の場合は
ちょっと工夫が必要ですが、質問のSJISファイルが全角
のみならこんなんでOKかと。

public class Converter {

   
   public static void convert(BinaryReader in, String format, BinaryWriter out) {
        //format の o に対応する文字部分だけ JIS にコンバートする
        byte[] buffer = new byte[2];
        while (!in.EndOfStream) {
           for (int i=0;i < format.length;i++) {
               in.read(buffer);
               if (format.charAt(i) == 'o') out.write(sjtojis(buffer));
               else out.write(buffer);
           }
        }
        in.close();
        out.flush();
        out.close();
   }
   private static byte[] sjtojis(byte[] buffer) {
       //変換るーちんこぴぺして貼り付けても動かないけど。。。

   }
}






引用返信 編集キー/
■29860 / inTopicNo.15)  Re[9]: 複数の文字コードでファイルを作成するには
□投稿者/ Jitta (558回)-(2008/12/15(Mon) 23:24:19)
Jitta さんの Web サイト
No29816 (.SHO さん) に返信
> string (UNICODE)から、S-JISのバイナリファイルを作るのと
> string (UNICODE)から、JISのバイナリファイルを作る処理を

 同じファイルに書き出したいようなので、ファイルを作ったらまずいと思う。
byte 配列で返すか、ストリームをもらってそこへ書き込むか。


 そいで、質問者さん。
JIS って、ダブルバイト・イン、シングルバイト・インなどのエスケープ文字があって、ダブルバイトとシングルバイトが入り交じると大変なことになるんだけど、「固定長」って、何が固定長なんでしょう?バイト数が「固定長」ってのは、場合によっては難しいと思う。
で、もし、対象の文字が ASCII 7bit の範囲内(英数記号)のみ、ってんなら、変換の必要はない。
引用返信 編集キー/
■29885 / inTopicNo.16)  Re[10]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (6回)-(2008/12/16(Tue) 11:27:00)
No29860 (Jitta さん) に返信

>  そいで、質問者さん。
> JIS って、ダブルバイト・イン、シングルバイト・インなどのエスケープ文字があって、ダブルバイトとシングルバイトが入り交じると大変なことになるんだけど、「固定長」って、何が固定長なんでしょう?バイト数が「固定長」ってのは、場合によっては難しいと思う。
> で、もし、対象の文字が ASCII 7bit の範囲内(英数記号)のみ、ってんなら、変換の必要はない。

1行が512バイトのデータを作成したいということです。
漢字が含まれる項目についてJISに変換したいです。

ファイル全体をJISにすることは簡単なのですが、
色々なアドバイスをもとに行っていますが、なかなか解決しません。


引用返信 編集キー/
■29886 / inTopicNo.17)  Re[11]: 複数の文字コードでファイルを作成するには
□投稿者/ よねKEN (235回)-(2008/12/16(Tue) 11:33:43)
> 色々なアドバイスをもとに行っていますが、なかなか解決しません。

どんな想定データに対して、
どんなコードを書いたのですか?
引用返信 編集キー/
■29946 / inTopicNo.18)  Re[12]: 複数の文字コードでファイルを作成するには
□投稿者/ TTT (7回)-(2008/12/16(Tue) 21:56:46)
2008/12/16(Tue) 22:27:25 編集(投稿者)

No29886 (よねKEN さん) に返信
>>色々なアドバイスをもとに行っていますが、なかなか解決しません。
>
> どんな想定データに対して、
> どんなコードを書いたのですか?

【想定データ】
データデータ内
コード char(20) ⇒12300
区分 char(1) ⇒0
日付 datetime ⇒2008/12/16
金額 char(4) ⇒8888
購入店 char(7) ⇒アアアシテン
商品char(10) ⇒鉛筆
:

取得したい結果
12300 0200812168888 アアアシテン鉛筆・・・←(JISコードだと漢字項目は文字化け)

前回記載した内容と変わりがありませんが・・・。
ここから手をつけれていません。

StringBuilder sb = new StringBuilder();
:※sbにはデータベースで取得した値を漢字項目のみJIS変換したのちセットしています。

画面のセッションに保持し、その保持した文字列をBinaryWriteで書き出しています。
string Data = sb ※すいませんcsvではありません
Session.Add(this.PageID,Data)

System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("Shift-JIS");
Response.BinaryWrite(encoding.GetBytes(csvData)); ⇒おそらくここで完全にShift-JISに変換されますよね。



引用返信 編集キー/
■29947 / inTopicNo.19)  Re[13]: 複数の文字コードでファイルを作成するには
□投稿者/ ま (176回)-(2008/12/16(Tue) 22:20:56)
No29946 (TTT さん) に返信
> >>色々なアドバイスをもとに行っていますが、なかなか解決しません。

たぶん解決しないでしょうね::

> Response.BinaryWrite(encoding.GetBytes(csvData));

CSV形式のファイルのダウンロードか。

情報小出しにしないでもっと出しましょう。




引用返信 編集キー/
■29948 / inTopicNo.20)  Re[14]: 複数の文字コードでファイルを作成するには
 
□投稿者/ TTT (8回)-(2008/12/16(Tue) 22:29:07)
No29947 (ま さん) に返信
> ■No29946 (TTT さん) に返信
>>>>色々なアドバイスをもとに行っていますが、なかなか解決しません。
>
> たぶん解決しないでしょうね::
>
>>Response.BinaryWrite(encoding.GetBytes(csvData));
>
> CSV形式のファイルのダウンロードか。
>
> 情報小出しにしないでもっと出しましょう。
>

すいません。小出しにしているつもりはありません。
今出せる情報は出しているつもりです。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -