質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

解決済

5回答

3578閲覧

C#での文字コード変換について

yamashita166

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

0クリップ

投稿2017/08/04 04:33

###前提・実現したいこと
開発環境
VisualStudio2010
C#

実現したいこと
バイナリ配列を変換し、StreamWriterで、SHIFT_JISやHEXやEBCDICコードが混在する文字列を出力したい。

###発生している問題
・SHIFT_JIS
・HEX
は問題なく変換出来たのですが、「EBCDIC」だけ変換しても空が帰ってきます。

###該当のソースコード

byte[] test = new byte[4]; test[0] = (byte)'1'; test[1] = (byte)'2'; test[2] = (byte)'3'; test[3] = (byte)'4'; string str = System.Text.Encoding.GetEncoding("IBM037").GetString(test);

###試したこと
調べた所、EBCDICにも色々種類があるようなので、
IBM037の他にも色々なEBCDICのコードを試しましたがだめでした。
SHIFT_JIS等は問題なく変換されます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

何か勘違いしてませんか? test がどういうバイト列になるか理解していますか?

以下のようにして試してみてください。[31][32][33][34] と出るはずです。

foreach (byte b in test) { Console.Write("[{0:X}]", b); }

16 進数で 31 32 33 34 というバイト列は Shift_JIS で '1' '2' '3' '4' という文字になります。なので、Encoding.GetEncoding("Shift_JIS").GetString(test) は "1234" という文字列が返されます。

Encoding.GetEncoding("IBM037").GetString(test) は 16 進数で 31 32 33 34 というバイト列を IBM037 と解釈して文字列に変換しようとしてますが、該当するものがないので文字化けするはずです。

以下のコードを試してみててください。

byte[] ibm037Byte = Encoding.GetEncoding("IBM037").GetBytes("1234"); foreach (byte b in ibm037Byte) { Console.Write("[{0:X}]", b); } string str = Encoding.GetEncoding("IBM037").GetString(ibm037Byte); Console.WriteLine("\n" + str);

結果は以下のようになるはずです。

[F1][F2][F3][F4]
1234

投稿2017/08/04 07:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamashita166

2017/08/07 05:09

おっしゃる通り勘違いをしていました。 とても分かりやすかったのでベストアンサーにさせて頂きます。
guest

0

byte型なのですか?char型じゃなくて?

ああ バイナリデータの文字コード変換ですね。読み間違えました。失礼しました。

投稿2017/08/04 05:07

編集2017/08/04 05:09
Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これだと
(byte)'1' である 0x31 に対する
EBCDICコードでの文字(表示できない文字)にしているので、見えないんでしょう。
意図は分かりませんが、プログラムとしては正しく動いています。

SHIFT_JISでうまくいっているというのは、勘違いかもしれませんよ。

"1234"という文字列を表す EBCDICでのバイト列を取得なら

C#

1Encoding.GetEncoding("IBM037").GetBytes("1234");

投稿2017/08/04 07:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamashita166

2017/08/07 05:12

表示できない文字で見えないだけというのは考えつかなかったです。 ありがとうございます。理解出来ました。
guest

0

引数の名前がうまく言ってないんですかね?
ためしに、対応のコードページ番号(IBM037であれば37)でやってみても駄目でしょうか?

C#

1 2string str = System.Text.Encoding.GetEncoding(37).GetString(test); 3

コードページとエンコード名の対応表の記載があるページがありましたので参考に
http://www.atmarkit.co.jp/ait/articles/0304/11/news004.html

投稿2017/08/04 05:57

Yuki_S

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamashita166

2017/08/04 07:24

回答ありがとうございます。 上記ソースで検証してみましたが、やはり空で帰ってきました。
guest

0

Encoding.Convert を使ってみてはどうでしょうか?

投稿2017/08/04 05:44

koguma98

総合スコア288

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamashita166

2017/08/04 07:24 編集

回答ありがとうございます。 Encoding.Convertを使用した所、空ではなくなったのですが、 想定していた文字(1⇒F1)にはなりませんでした。 ascii⇒ebcdicでConvertをかけました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問