アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
宜しくお願いします。

C#でプログラムを開発しております。
その中で、文字列をShift-JISでテキストファイルへ書き出す
という処理があるんですが
以下のように指定しても文字コードがUTF-8で書き出されているようです。
コードを調べましたが間違いが見つけられません。
どこか間違いはございますでしょうか。
ご教授宜しくお願いします。

・文字コードを判別する場所 : http://encode-detector.uic.jp/tool

・テキストの形式 :ファイル名.DMD

/////////////// 以下コード /////////////////////////

    String param = "テキストへ書き込む内容";

    System.IO.StreamWriter sw =
         new System.IO.StreamWriter(
            @"C:\hoge.DMD", 
            false,
            System.Text.Encoding.GetEncoding("Shift_JIS") );

    System.Text.Encoding src = System.Text.Encoding.UTF8;
    System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");

    byte[] temp = src.GetBytes(param);
    byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);
    param = dest.GetString(sjis_temp);

    sw.Write(param);

    sw.Close();

A 回答 (5件)

せっかくStreamWriter使っているのですから,Writeにそのまま文字列を渡せば良いのでは。

この回答への補足

説明不足でした。
失礼しました。

もともと以下の部分はコードとして書いていなかったものです。

    System.Text.Encoding src = System.Text.Encoding.UTF8;
    System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");

    byte[] temp = src.GetBytes(param);
    byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);
    param = dest.GetString(sjis_temp);

以前はおっしゃる通り、StreamWriterにそのままparamを渡していたのですが
UTF-8で書き出されておりましたので、明示的に変換してみた。
という形になります。
先ほど指摘頂いた通り、上記の無駄な処理を省いて
StreamWriterにparamを渡して実行したところ
UTF-8で書き出されておらず
中央ヨーロッパ言語 (ISO) - iso-8859-2 で書き出されておりました。

どの道Shift-JISではないので、解決はしてないんですが。

補足日時:2013/04/24 17:38
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
後半の文が余計でした。
文字コードの判別方法についてもう一度考え直します。
ありがとうございました。

お礼日時:2013/05/27 12:22

>>こちらでやってみると


>どのように確認されたんでしょうか。

VC#2010EEでフォームアプリケーションで新規プロジェクト「qa8057608」を作成。
Form1上にボタンを配置して、Clickイベントハンドラに掲示されているコードをそのままコピペで貼ってビルド。
実行して[Button1]をクリック。
出力されたC:\hoge.DMDを秀丸で文字コード自動判別で読み込ませて、判定された文字コードを確認しただけです。
ついでにファイルサイズも確認してますが。
# "テキストへ書き込む内容"をUTF-8(BOMなし)で保存すると33バイトになります。
    • good
    • 0

>UTF-8で書き出されておりましたので、明示的に変換してみた。


という形になります。

stringの内部の文字コードはunicodeですから、stringに戻してる時点で意味がありません。
    • good
    • 0

ISO-8859-2である,というのはどのようにして確認したのでしょうか。



基本的に,Shift_JISで利用する文字集合の範囲とISO-8859-2で利用する文字集合の範囲は,
ISO 646部分を除くとほとんど重複しません。

そして,ISO/IEC 8859の各パートで定義されるのは96文字からなる文字集合であるため,
0x00 - 0xFFのすべての数値が各オクテットに出てくる可能性があります。
このため,自動判別でISO-8859-2になった,というのであれば,根拠になり得ません。


もう一度,ちゃんと確認すべきかと思います。
「<文字> (<U+xxxx>) をオクテット列に書き出したら<0xYY 0xZZ>になったから<文字コード>>として出力されたと認識した」
上記が文章が特定の文字コードである理由を述べるための基本的なフォーマットです。
上記の<>で囲まれた部分を対象に合わせて置き換えて,ISO-8859-2である理由を提示してみて下さい。
    • good
    • 0

#1さんの書かれているとおりですが……。


GetBytes()とかGetString()とか必要ですか?

あと……
>以下のように指定しても文字コードがUTF-8で書き出されているようです。
どのように確認されました?

こちらでやってみると、普通にShiftJISで出力(22バイト)されていましたけど…。

この回答への補足

>どのように確認されました?

質問文に記載しておりますURLで
テキストのコピーを貼り付けて「実行」ボタンのクリックです。
また、ファイルの選択から
ファイルを選択して、「実行」ボタンのクリックです。

>こちらでやってみると
どのように確認されたんでしょうか。

補足日時:2013/04/24 17:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!