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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.53043 の関連記事表示

<< 0 | 1 >>
■53043  iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/02(Thu) 00:26:35)

    分類:[C#] 

    初めて投稿させて頂きます。

    開発環境は、
    WinXP
    VS2005(C#)
    SQLServer2005
    にてWindowFormのアプリ開発を行っております。

    ある処理にてクラス:StreamWriterを使用してCSV出力を行っています。
    その際に文字コード「iso-2022-jp」を指定しているのですが、この場合
    「半角カナ文字」が「全角カナ文字」に自動変換されてしまいます。
    別サイトで『シフトアウト』??、『シフトイン』??を行えば、iso-2022-jpでも
    半角カナを扱えるとあったのですが、具体的な使用方法が分からず困っております。

    仕様上、文字コードは変更できず、また半角カナもそのまま半角で欲しいとの事です。
    他の方法でも構いません、StreamWriterを使用したやり方があればご教授下さい。

    宜しくお願い致します。

親記事 /過去ログ89より / 関連記事表示
削除チェック/

■53047  Re[1]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 -(2010/09/02(Thu) 09:36:20)
    No53043 (いか さん) に返信
    > ある処理にてクラス:StreamWriterを使用してCSV出力を行っています。
    > その際に文字コード「iso-2022-jp」を指定しているのですが、この場合
    具体的には、どのようなコードを書いておられますか?
    
    
    // Encoding の取得
    Encoding[] enc = new Encoding[4];
    enc[0] = Encoding.GetEncoding(932);
    enc[1] = Encoding.GetEncoding(50220);
    enc[2] = Encoding.GetEncoding(50221);
    enc[3] = Encoding.GetEncoding(50222);
    
    Console.WriteLine("下記はすべて iso-2022-jp と表示されます。");
    Console.WriteLine(enc[0].BodyName);
    Console.WriteLine(enc[0].HeaderName);
    Console.WriteLine(enc[1].BodyName);
    Console.WriteLine(enc[1].HeaderName);
    Console.WriteLine(enc[1].WebName);
    Console.WriteLine(enc[2].BodyName);
    Console.WriteLine(enc[2].HeaderName);
    Console.WriteLine(enc[3].BodyName);
    Console.WriteLine(enc[3].HeaderName);
    Console.WriteLine(enc[3].WebName);
    
    string src = "\uff72\uff76";
    Console.WriteLine();
    Console.WriteLine("半角カナを含む \"{0}\" の変換テスト", src);
    Console.WriteLine();
    foreach (Encoding encode in enc)
    {
        byte[] bin = encode.GetBytes(src);
        string dst = encode.GetString(bin);
        Console.WriteLine("{0,6}\t\"{1}\"", encode.CodePage, encode.EncodingName);
        Console.WriteLine("\t{0}\t\"{1}\"", dst, BitConverter.ToString(bin));
    }
    
    Console.ReadLine();
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53059  Re[2]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/02(Thu) 13:00:13)
    No53047 (魔界の仮面弁士 さん) に返信
    > ■No53043 (いか さん) に返信

    魔界の仮面弁士様、早速の返信ありがとうございます。

     コードは下記の通りです。

     StreamWriter sr = new StreamWriter(ファイルPATH, true, Encoding.GetEncoding("iso-2022-jp"));

     string sMSG;
     sMSG = DBから取得した項目1;
     sMSG = sMSG + "," + DBから取得した項目2;  ←左記項目が半角カナです。
     sMSG = sMSG + "," + DBから取得した項目3;

     sr.WriteLine(sMSG);

     sr.Close();

    所感では、「DBから取得した項目2」を出力文字列にセットする際に、シフトアウト/インのコードも
    あわせてセットするのではないか?と思っています。(違ったらすいません。)

    お手数ですが、宜しくお願い致します。

記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53060  Re[3]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu -(2010/09/02(Thu) 13:10:30)
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53061  Re[3]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 -(2010/09/02(Thu) 13:15:04)
    No53059 (いか さん) に返信
    > Encoding.GetEncoding("iso-2022-jp")

    これだと、先のサンプルで言うところの 50220 指定と同じ意味になります。
    他のエンコーディングの中から、都合のよい物を選択してみて下さい。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53064  Re[4]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/02(Thu) 14:11:35)

    shu 様
    魔界の仮面弁士 様
    管理人 様

     お忙しい中、ご指摘ありがとうございます。
     皆様に教えて頂いた方法にてやってみたいと思います。
     結果はまた報告致します。

記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53083  Re[5]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/02(Thu) 18:04:14)
    お世話になっております、いかです。再度質問させて下さい。

    shu様に教えて頂いた下記のサイトを見ましたが、半角カナも開始と終了を宣言すれば、
    使用できると言う事は分かりましたが、お恥ずかしい話ですが、具体的な使用方法が分かりませんでした・・・。

    //////////////////////////////////////////////////////////////
    shu様の書き込みから引用

     http://charset.7jp.net/jis.html
     にJISコード(ISO-2022-JP)の説明があります。

     ESC ( I (charコード 0x1B, 0x28, 0x49 )で半角モード
     ESC $ @ (charコード 0x1B, 0x24, 0x40 )で旧JIS漢字
     ESC $ B (charコード 0x1B, 0x24, 0x42 )で新JIS漢字
     ESC & @ ESC $ B (charコード 0x1B, 0x26, 0x40 0x1B, 0x24, 0x42)で漢字の開始
     となっています。
    //////////////////////////////////////////////////////////////

    具体的な使用方法など教えて頂けると助かります。 

    何度も申し訳ありませんが、宜しくお願い致します。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53084  Re[6]: iso-2022-jpを指定したCSV出力について
□投稿者/ なちゃ -(2010/09/02(Thu) 19:50:29)
    元々半角カナが使えるエンコーディングですむならそれがいいというのが
    共通のアドバイスだと思いますが、それではダメだったのですかね?
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53096  Re[7]: iso-2022-jpを指定したCSV出力について
□投稿者/ よねKEN -(2010/09/03(Fri) 00:45:50)
    No53084 (なちゃ さん) に返信
    > 元々半角カナが使えるエンコーディングですむならそれがいいというのが
    > 共通のアドバイスだと思いますが、それではダメだったのですかね?

    端的に言うと、Encoding.GetEncoding("iso-2022-jp")の代わりにEncoding.GetEncoding(50221)を
    使えばいい、ということですが、それが伝わっていないのかと。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53087  Re[6]: iso-2022-jpを指定したCSV出力について
□投稿者/ やじゅ -(2010/09/02(Thu) 21:33:50)
>
    2010/09/03(Fri) 07:28:09 編集(投稿者)
    2010/09/02(Thu) 21:36:31 編集(投稿者)

    No53083 (いか さん) に返信
    > shu様に教えて頂いた下記のサイトを見ましたが、半角カナも開始と終了を宣言すれば、
    > 使用できると言う事は分かりましたが、お恥ずかしい話ですが、具体的な使用方法が分かりませんでした・・・。
    >  ESC ( I (charコード 0x1B, 0x28, 0x49 )で半角モード

    文字列をバイト型配列に変換する
    http://dobon.net/vb/dotnet/string/getencoding.html
    バイト型配列にした上で、半角モードである0x1B, 0x28, 0x49 を半角カナの前に追加する。
    そして、BinaryWriteを使ってファイルに書き込むとかすれば。


    下記サイトで半角カナを交えた文字を入れればバイナリイメージがわくと思うよ。
    文字コードの16進ダンプ http://charset.7jp.net/dump.html

    追記: Encoding.GetEncoding(50221);あたりを使えば、あっさり出来るってことかな。
    文字コード コードページID コードページ名
    日本語 JIS 50220 iso-2022-jp
    日本語 JIS(1バイトカタカナ可) 50221 csISO2022JP
    日本語 JIS(1バイトカタカナ可 - SO/SI) 50222 iso-2022-jp
    http://dobon.net/vb/dotnet/file/readfile.html
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53098  Re[7]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu -(2010/09/03(Fri) 08:38:35)
    俺も、どぼんさんの提示方法でよければそっちを使うようにと書いているんだけどね。
    多分やろうとしているのは50222なんだと思います。
    Binary比較してみればいいんだと思うけど、たぶん出来ないんだろうな・・・
    もし"ISO-2022-JP"という文字列を受けてEncodingを取得するなら、文字列見て
    50222のEncodingを取得しても良いと思います。

    提示された方法は1つじゃないんだから出来そうな所から試していって思った動きをしたのを
    採用すればいいですよ。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53107  Re[8]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/03(Fri) 13:51:30)
    お世話になっております。

    出来ました!!!

    StreamWriter sr = new StreamWriter(50221)
    と指定したら半角カナが出力できました。
    皆さんがおっしゃりかった事は、
    StreamWriter sr = new StreamWriter(50220)
    を、
    StreamWriter sr = new StreamWriter(50221)
    に変えろと言う事だったのですね。
    私は、コードIDは「50220」のままで、半角カナのフィールドを出力する際に、
    何か特殊な指定をするのかと思っていました。

    コードID「50221」もJISコードには変わりないので、あとは他のシステムにて
    正常に取り込めればOKです。

    ちなみにコードID「50222」を指定した場合は、文字化けしてしまいました。
    50221と同じ半角カナ文字を許可するコード体系みたいですけどね・・・

    とりあえずこの「50221」を指定してやってみます。

    皆様、お忙しい中、このような素人相手に最後まで付き合って下さって
    本当にありがとうございました。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53108  Re[9]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/03(Fri) 13:51:51)
    No53107 (いか さん) に返信
    > お世話になっております。
    >
    > 出来ました!!!
    >
    > StreamWriter sr = new StreamWriter(50221)
    > と指定したら半角カナが出力できました。
    > 皆さんがおっしゃりかった事は、
    > StreamWriter sr = new StreamWriter(50220)
    > を、
    > StreamWriter sr = new StreamWriter(50221)
    > に変えろと言う事だったのですね。
    > 私は、コードIDは「50220」のままで、半角カナのフィールドを出力する際に、
    > 何か特殊な指定をするのかと思っていました。
    >
    > コードID「50221」もJISコードには変わりないので、あとは他のシステムにて
    > 正常に取り込めればOKです。
    >
    > ちなみにコードID「50222」を指定した場合は、文字化けしてしまいました。
    > 50221と同じ半角カナ文字を許可するコード体系みたいですけどね・・・
    >
    > とりあえずこの「50221」を指定してやってみます。
    >
    > 皆様、お忙しい中、このような素人相手に最後まで付き合って下さって
    > 本当にありがとうございました。
    >
記事No.53043 のレス / END /過去ログ89より / 関連記事表示
削除チェック/

■53110  Re[9]: iso-2022-jpを指定したCSV出力について
□投稿者/ よねKEN -(2010/09/03(Fri) 14:15:49)
>
    No53107 (いか さん) に返信
    > ちなみにコードID「50222」を指定した場合は、文字化けしてしまいました。
    > 50221と同じ半角カナ文字を許可するコード体系みたいですけどね・・・

    お話にでてきている他のシステムでですか?
    それ以外の方法で確認したのであれば、それは確認した方法が、
    50222の文字コードを処理できない手段なだけかと思います。
記事No.53043 のレス / END /過去ログ89より / 関連記事表示
削除チェック/

■53115  Re[10]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/03(Fri) 14:40:02)
    No53110 (よねKEN さん) に返信
    > ■No53107 (いか さん) に返信

    いえ、出力したファイルをテキストエディタ(Sakuraエディタ)で開いて
    確認しました。
    確かにおっしゃるとおり、文字化けはしていましたが、文字コードは「JIS」
    となっていました。

    とりあえず、現状は「50221」でやってみたいと思います。
    「50221」もJISである為大丈夫ではないかと考えています。

    ご指摘ありがとうございました。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53116  Re[11]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu -(2010/09/03(Fri) 14:46:18)
    No53115 (いか さん) に返信
    > いえ、出力したファイルをテキストエディタ(Sakuraエディタ)で開いて
    > 確認しました。
    > 確かにおっしゃるとおり、文字化けはしていましたが、文字コードは「JIS」
    > となっていました。
    >
    > とりあえず、現状は「50221」でやってみたいと思います。
    > 「50221」もJISである為大丈夫ではないかと考えています。
    >
    > ご指摘ありがとうございました。
    >
    よねKEN さんが指摘したのは取込むシステムでどうなるかを確認しなきゃ駄目だよってことです。
    Sakuraエディタが駄目で他のエディタが良くても確認はとれないし、どのテキストエディタで駄目でも実際に
    取込むシステムでOKならOKなのです。取込むシステムで試せないのならバイナリエディタで確認するのが
    良いかと思います。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53118  Re[11]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 -(2010/09/03(Fri) 15:04:18)
    No53115 (いか さん) に返信
    たとえば、半角カナの "イカ" については、
     半角カナ「イ」 :32
     半角カナ「カ」 :36
     半角数字「2」 :32
     半角記号「6」 :36
     全角文字「俺」:32,36
    というバイナリで表現されます。

    ご覧の通り、いずれも同じコードになっているので、バイナリ 32,36 というデータだけでは、
    それが "26" なのか "俺" なのか 半角"イカ" なのかわかりません。

    そこで、エスケープシーケンス等を用いて、それがどの文字セットなのかを
    切り替えるという仕組みになっています。


    しかし GetEncoding("iso-2022-jp") すなわち GetEncoding(50220) の場合は、
    そもそも半角カナを含む文字セットを持っていません。
    全角カナに置き換えられたのもそのためでしょう。


    一方、GetEncoding(50221) や GetEncoding(50222) では、
    半角カナも扱う事ができます。ただしそのバイナリ表現が異なります。
    (これらは ISO-2022-JP から派生した表現ですが、ISO-2022-JP とは別物です)

    先の 半角カナ2文字の "イカ" でいえば、
     GetEncoding(50221) では、1B-28-49, 32, 36, 1B-28-42
     GetEncoding(50222) では、 0E , 32, 36, 0F
    というバイナリに変換されます。前後のバイナリを除けば、「32,36」ですよね。


    > いえ、出力したファイルをテキストエディタ(Sakuraエディタ)で開いて
    > 確認しました。
    > 確かにおっしゃるとおり、文字化けはしていましたが、文字コードは「JIS」
    > となっていました。
    (秀丸 ver.8 では、どちらも「JIS」ファイルとして文字化けせずに読み込めます)

    1B-28-42 では、『ISO/IEC 646(ASCII)』という文字集合に切り替わります。
    1B-28-49 では、『JIS X 0201 カナ(半角カナ)』に切り替わります。
    1B-24-42 なら、『JIS X 0208-1983(第1・第2水準漢字)』です。

    0E は『IBMDBCS-Host』、
    0F は『EBCDIC(IBM)』です。


    > ご指摘ありがとうございました。
    マルチポスト先へのフィードバックも忘れずに。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53174  Re[12]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか -(2010/09/05(Sun) 13:20:15)
    いつもお世話になっております。
    返事が遅くなり申し訳ありません。

    shuさんのおっしゃるとおり、出力されたファイルは、最終的に
    他のシステムにて確認する事が必要ですね。
    現状はすぐには確認はできませんが、結合試験等で確認するようにします。

    魔界の仮面弁士さん、ご丁寧な解説ありがとうございました。
    自分の勉強不足さを痛感しました・・・。
    こういう基本的な知識こそ、知っているのと知らないのでは雲泥の差が出るものですね。
    ありがとうございました。


記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53184  Re[13]: iso-2022-jpを指定したCSV出力について
□投稿者/ よねKEN -(2010/09/06(Mon) 00:17:58)
    No53174 (いか さん) に返信
    > 他のシステムにて確認する事が必要ですね。
    > 現状はすぐには確認はできませんが、結合試験等で確認するようにします。

    他システムとの確認には2つの意味があります。
    (1)他システムとのインタフェース仕様としての文字コードの確認
    (2)他システムで実際にファイルを取り込んでみての文字化けしないことの検証

    実際に動かしてみての検証(2)は結合試験の段階でもよいかもしれませんが、
    相手側が求める半角カナを含むJISがどういうコード体系なのか(つまり、50221か50222)(1)は
    他システムとのインタフェース仕様なのですから、早い段階で他システム側の担当者に確認しておいた方がよいですよ。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

■53186  Re[13]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 -(2010/09/06(Mon) 09:49:20)
    No53174 (いか さん) に返信
    > 魔界の仮面弁士さん、ご丁寧な解説ありがとうございました。
    > 自分の勉強不足さを痛感しました・・・。
    このあたりの知識が無いと、 No53047 のサンプルを見ても、
    実行結果の意味を理解しにくいかも知れませんね…。


    > 現状はすぐには確認はできませんが、結合試験等で確認するようにします。
    その前に、仕様を確認しましょう。

    もしも本当に iso-2022-jp が望まれているのだとしたら、
    そもそも半角カナは渡せませんし、渡すべきでもありません。

    その場合には、半角カナを含むデータを処理するにあたり、
     ・変換エラーとして処理する。
     ・代替文字(全角カナなど)に置き換える。
     ・使用不可能文字として、それらの文字を取り除く。
    など、何らかの対処を行う必要があるでしょう。
    (設計者がそこまで考慮していなかった可能性もありますが、その場合は
    問題点として挙げて、どのように振る舞うべきかを定めるべきです)


    逆に、半角カナの受け渡しも必要とされているのだとすれば、CSV に
    そもそも iso-2022-jp が選択されることは無いハズです。とはいえ、
    仕様書側が誤っていて「iso-2022-jp」と記述されている可能性も
    ありえますので、事前に担当者にきちんと確認しておきましょう。


    なお、iso-2022-jp では使えないはずの『JIS X 0201(半角カナ)』や
    『JIS X 0212(補助漢字)』を使えるように拡張した独自の実装を、
    ISO-2022-JP であると(誤って)呼称している例も少なからずあります。

    その場合、文字集合を切り替えるために用いられる
    制御文字(またはエスケープシーケンス)のバイナリが、その処理系で
    どのように定義されているのかを正しく把握する必要があるでしょう。

    独自拡張の場合、その内容によっては、標準で用意された Encoding クラスでは
    対処しきれず、自前での変換が求められるケースもあったりしますので、
    結合試験の段階で確認するのでは遅いと思いますよ。
記事No.53043 のレス /過去ログ89より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 >>

パスワード/

- Child Tree -