none
シフトJISからJISへの変換 RRS feed

  • 質問

  • シフトJIS の 文字列を JIS に変換したいです。

     

     

    string  swk  =  "丸中太郎";

     

    string  swk1;

     

    byte[]    by;

     

    by  =  Encoding.GetEncoding(  "shift_jis"  ).GetBytes(  swk  );

     

    swk1  =  Encoding.GetEncoding(  "iso-2022-jp"  ).GetString(  by  );

     

     

    これで swk1 に JISコードに 変換されるのでしょうか?

    2008年7月23日 9:30

回答

  • > string  swk  =  "丸中太郎";

     

    この時点で,swkにはUTF-16の文字列として記録されています。

    というか,String型は常にUTF-16の文字列になります。

     

    > by  =  Encoding.GetEncoding(  "shift_jis"  ).GetBytes(  swk  );

    > swk1  =  Encoding.GetEncoding(  "iso-2022-jp"  ).GetString(  by  );

     

    これは,swkを,Shift_JIS (正確にはWindows-31j) のバイト列に変換し,それをISO-2022-JPのバイト列と見なしてUTF-16の文字列化しています。

    なので,これは例外を発生させるはずです。

     

    非UTF-16を非UTF-16のまま扱いたいのであれば,byteの配列を使います。

    Shift_JISからISO-2022-JPの変換は,

    byte[] (Shift_JIS) → Encoding.GetString → string (UTF-16) → Encoding.GetBytes → byte[] (ISO-2022-JP)

    または

    byte[] (Shift_JIS) → Encoding.Convert → byte[] (ISO-2022-JP)

    という経路になります。

     

    また,文字列をISO-2022-JPのバイト列に変換したいだけなのであれば,Encoding.GetBytesを使えばよいです。

    2008年7月23日 10:14
  • iso-2022-jp の Encoding を使った StreamWriter で書き出せばいいでしょう。

    2008年7月23日 11:30
  • byte配列にデータを入れて、BinaryWriterで書き出せば良いでしょう。
    2008年7月24日 2:03
    モデレータ

すべての返信

  • > string  swk  =  "丸中太郎";

     

    この時点で,swkにはUTF-16の文字列として記録されています。

    というか,String型は常にUTF-16の文字列になります。

     

    > by  =  Encoding.GetEncoding(  "shift_jis"  ).GetBytes(  swk  );

    > swk1  =  Encoding.GetEncoding(  "iso-2022-jp"  ).GetString(  by  );

     

    これは,swkを,Shift_JIS (正確にはWindows-31j) のバイト列に変換し,それをISO-2022-JPのバイト列と見なしてUTF-16の文字列化しています。

    なので,これは例外を発生させるはずです。

     

    非UTF-16を非UTF-16のまま扱いたいのであれば,byteの配列を使います。

    Shift_JISからISO-2022-JPの変換は,

    byte[] (Shift_JIS) → Encoding.GetString → string (UTF-16) → Encoding.GetBytes → byte[] (ISO-2022-JP)

    または

    byte[] (Shift_JIS) → Encoding.Convert → byte[] (ISO-2022-JP)

    という経路になります。

     

    また,文字列をISO-2022-JPのバイト列に変換したいだけなのであれば,Encoding.GetBytesを使えばよいです。

    2008年7月23日 10:14
  • 回答ありがとうございます。

     

    補足説明です。

     

    実は、 シフトJISで保存されたテキストファイルを読み込んで JIS に 変換したかったのです。

     

    テキストファイルに 丸中太郎 と 保存して(a.txt)

     

    string  swk;

     

    using(  StreamReader  sr  =  new  StreamReader(  "a.txt",  Encoding.Default  )  )

    {

    swk  =  sr.ReadLine();

    }

     

    この swk を JIS に 変換したいのです。

    2008年7月23日 10:57
  • iso-2022-jp の Encoding を使った StreamWriter で書き出せばいいでしょう。

    2008年7月23日 11:30
  • 最終的にどのようにされたいのかわかりませんが、サンプルの一つとして以下があります。

     

    Encoding クラス

    http://msdn.microsoft.com/ja-jp/library/system.text.encoding(VS.80).aspx

    2008年7月23日 14:36
    モデレータ
  • 詳細を説明します。

     

    エプソンのVP6200 というドットプリンターで伝票印字しようとしています。

    プリンタドライバーを使用せず、LANケーブルで接続して ソケットコマンドで 印刷します。

     

    最終的には 印刷イメージの テキストファイルを作成し それを 送信して印刷します。

     

    このような 感じです。( ページ、行、データ )

     

    0001,001,"   ここに データ が 入ります  "

     

    ところが このプリンターは 全角文字は JIS でなければならないみたいで。 しかも、スタート、ストップで 囲んでやらないとだめなようです。

    スタート:char[]    csta  =  {  (char)0x1c,  (char)0x26,  (char)0x00  };

    ストップ:char[]    cend  =  {  (char)0x1c,  (char)0x2e,  (char)0x00  };

     

    string ssta = new string( csta);

    string send = new string( cend );

     

    つまり  丸中太郎  -->  ssta  +  Am!!L3!!!!!!  +  send  で ファイルに書いてやらないといけません。

     

    string  swk;

     

    using(  StreamWriter  sw  =  new  (  "a2.txt",  false,  Encoding.GetEncoding(  "iso-2022-jp"  )  )  )

    using(  StreamReader  sr  =  new  (  "a1.txt",  Encoding.Default  )  )

    {

    swk  =  sr.ReadLine();

     

    swk  =  ssta  +  swk  +  send;

     

    sw.WriteLine(  swk  );

    }

     

     

    これだと ssta ,  send も JIS に なっているようで。

     

    従って、ファイルはシフトJIS で 書き出して 全角文字のみ JIS に 変換しないと だめだと思います。

     

     

    2008年7月24日 1:16
  • byte配列にデータを入れて、BinaryWriterで書き出せば良いでしょう。
    2008年7月24日 2:03
    モデレータ
  • こんにちは。中川俊輔 です。

     

    皆様、回答ありがとうございます。

     

    丸中太郎さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    勝手ながら有用な情報と思われる回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    丸中太郎さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年8月6日 8:01