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

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

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

Re[12]: iso-2022-jpを指定したCSV出力について


(過去ログ 89 を表示中)

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

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

分類:[C#] 

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

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

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

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

宜しくお願い致します。


引用返信 編集キー/
■53047 / inTopicNo.2)  Re[1]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 (1783回)-(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();

引用返信 編集キー/
■53059 / inTopicNo.3)  Re[2]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (2回)-(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」を出力文字列にセットする際に、シフトアウト/インのコードも
あわせてセットするのではないか?と思っています。(違ったらすいません。)

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


引用返信 編集キー/
■53060 / inTopicNo.4)  Re[3]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu (2回)-(2010/09/02(Thu) 13:10:30)
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=27252&rev=&no=0
にコメントしてあるので確認よろしく。
引用返信 編集キー/
■53061 / inTopicNo.5)  Re[3]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 (1784回)-(2010/09/02(Thu) 13:15:04)
No53059 (いか さん) に返信
> Encoding.GetEncoding("iso-2022-jp")

これだと、先のサンプルで言うところの 50220 指定と同じ意味になります。
他のエンコーディングの中から、都合のよい物を選択してみて下さい。
引用返信 編集キー/
■53064 / inTopicNo.6)  Re[4]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (3回)-(2010/09/02(Thu) 14:11:35)

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

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


引用返信 編集キー/
■53083 / inTopicNo.7)  Re[5]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (4回)-(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)で漢字の開始
 となっています。
//////////////////////////////////////////////////////////////

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

何度も申し訳ありませんが、宜しくお願い致します。

引用返信 編集キー/
■53084 / inTopicNo.8)  Re[6]: iso-2022-jpを指定したCSV出力について
□投稿者/ なちゃ (467回)-(2010/09/02(Thu) 19:50:29)
元々半角カナが使えるエンコーディングですむならそれがいいというのが
共通のアドバイスだと思いますが、それではダメだったのですかね?

引用返信 編集キー/
■53087 / inTopicNo.9)  Re[6]: iso-2022-jpを指定したCSV出力について
□投稿者/ やじゅ (1711回)-(2010/09/02(Thu) 21:33:50)
やじゅ さんの Web サイト
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
引用返信 編集キー/
■53096 / inTopicNo.10)  Re[7]: iso-2022-jpを指定したCSV出力について
□投稿者/ よねKEN (602回)-(2010/09/03(Fri) 00:45:50)
No53084 (なちゃ さん) に返信
> 元々半角カナが使えるエンコーディングですむならそれがいいというのが
> 共通のアドバイスだと思いますが、それではダメだったのですかね?

端的に言うと、Encoding.GetEncoding("iso-2022-jp")の代わりにEncoding.GetEncoding(50221)を
使えばいい、ということですが、それが伝わっていないのかと。
引用返信 編集キー/
■53098 / inTopicNo.11)  Re[7]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu (3回)-(2010/09/03(Fri) 08:38:35)
俺も、どぼんさんの提示方法でよければそっちを使うようにと書いているんだけどね。
多分やろうとしているのは50222なんだと思います。
Binary比較してみればいいんだと思うけど、たぶん出来ないんだろうな・・・
もし"ISO-2022-JP"という文字列を受けてEncodingを取得するなら、文字列見て
50222のEncodingを取得しても良いと思います。

提示された方法は1つじゃないんだから出来そうな所から試していって思った動きをしたのを
採用すればいいですよ。
引用返信 編集キー/
■53107 / inTopicNo.12)  Re[8]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (5回)-(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」を指定してやってみます。

皆様、お忙しい中、このような素人相手に最後まで付き合って下さって
本当にありがとうございました。

引用返信 編集キー/
■53108 / inTopicNo.13)  Re[9]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (6回)-(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」を指定してやってみます。
>
> 皆様、お忙しい中、このような素人相手に最後まで付き合って下さって
> 本当にありがとうございました。
>
解決済み
引用返信 編集キー/
■53110 / inTopicNo.14)  Re[9]: iso-2022-jpを指定したCSV出力について
□投稿者/ よねKEN (603回)-(2010/09/03(Fri) 14:15:49)
よねKEN さんの Web サイト
No53107 (いか さん) に返信
> ちなみにコードID「50222」を指定した場合は、文字化けしてしまいました。
> 50221と同じ半角カナ文字を許可するコード体系みたいですけどね・・・

お話にでてきている他のシステムでですか?
それ以外の方法で確認したのであれば、それは確認した方法が、
50222の文字コードを処理できない手段なだけかと思います。

解決済み
引用返信 編集キー/
■53115 / inTopicNo.15)  Re[10]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (7回)-(2010/09/03(Fri) 14:40:02)
No53110 (よねKEN さん) に返信
> ■No53107 (いか さん) に返信

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

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

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

引用返信 編集キー/
■53116 / inTopicNo.16)  Re[11]: iso-2022-jpを指定したCSV出力について
□投稿者/ shu (5回)-(2010/09/03(Fri) 14:46:18)
No53115 (いか さん) に返信
> いえ、出力したファイルをテキストエディタ(Sakuraエディタ)で開いて
> 確認しました。
> 確かにおっしゃるとおり、文字化けはしていましたが、文字コードは「JIS」
> となっていました。
>
> とりあえず、現状は「50221」でやってみたいと思います。
> 「50221」もJISである為大丈夫ではないかと考えています。
>
> ご指摘ありがとうございました。
>
よねKEN さんが指摘したのは取込むシステムでどうなるかを確認しなきゃ駄目だよってことです。
Sakuraエディタが駄目で他のエディタが良くても確認はとれないし、どのテキストエディタで駄目でも実際に
取込むシステムでOKならOKなのです。取込むシステムで試せないのならバイナリエディタで確認するのが
良いかと思います。
引用返信 編集キー/
■53118 / inTopicNo.17)  Re[11]: iso-2022-jpを指定したCSV出力について
□投稿者/ 魔界の仮面弁士 (1787回)-(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)』です。


> ご指摘ありがとうございました。
マルチポスト先へのフィードバックも忘れずに。
引用返信 編集キー/
■53174 / inTopicNo.18)  Re[12]: iso-2022-jpを指定したCSV出力について
□投稿者/ いか (8回)-(2010/09/05(Sun) 13:20:15)
いつもお世話になっております。
返事が遅くなり申し訳ありません。

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

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



引用返信 編集キー/
■53180 / inTopicNo.19)  Re[12]: iso-2022-jpを指定したCSV出力について
□投稿者/ Azulean (601回)-(2010/09/05(Sun) 19:56:21)
>>ご指摘ありがとうございました。
> マルチポスト先へのフィードバックも忘れずに。

URL を提示するだけでなく、どうやって解決したかを記載しておきましょう。
URL だけでは、その URL で辿れなくなることがありますので。

# ちなみに、この BBS は過去ログに移る際に URL が変わります。
引用返信 編集キー/
■53184 / inTopicNo.20)  Re[13]: iso-2022-jpを指定したCSV出力について
 
□投稿者/ よねKEN (604回)-(2010/09/06(Mon) 00:17:58)
No53174 (いか さん) に返信
> 他のシステムにて確認する事が必要ですね。
> 現状はすぐには確認はできませんが、結合試験等で確認するようにします。

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

実際に動かしてみての検証(2)は結合試験の段階でもよいかもしれませんが、
相手側が求める半角カナを含むJISがどういうコード体系なのか(つまり、50221か50222)(1)は
他システムとのインタフェース仕様なのですから、早い段階で他システム側の担当者に確認しておいた方がよいですよ。

引用返信 編集キー/

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

管理者用

- Child Tree -