トップ回答者
シフトJISからJISへの変換

質問
回答
-
> 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を使えばよいです。
すべての返信
-
> 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を使えばよいです。
-
最終的にどのようにされたいのかわかりませんが、サンプルの一つとして以下があります。
Encoding クラス
http://msdn.microsoft.com/ja-jp/library/system.text.encoding(VS.80).aspx
-
詳細を説明します。
エプソンの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 に 変換しないと だめだと思います。