2011-11-13 4 views
0

私が書いている小さなツールでエンコーディングと一般的な混乱があります。テキストボックスからASCII/UTF8データを使用してP6 .ppmをASCIIで書き込む。エンコーディング混乱?

まず最初に、以下のコードはちょっと残念ですが、私がこれまでに書いたコードのうち、実際に作業するのに最も近いことをお詫びします。

私は次のコードを使用している場合:

/*create file*/ 
FileStream fileS = new FileStream(filename + ".ppm", FileMode.Create, FileAccess.ReadWrite, FileShare.None, 8, FileOptions.None); 
/*create a binary writer*/ 
BinaryWriter bWriter = new BinaryWriter(fileS, Encoding.ASCII); 

/*write ppm header*/ 
string buffer = "P6 "; 
bWriter.Write(buffer.ToCharArray(), 0, buffer.Length); 
buffer = width.ToString() + " "; 
bWriter.Write(buffer.ToCharArray(), 0, buffer.Length); 
buffer = height.ToString() + " "; 
bWriter.Write(buffer.ToCharArray(), 0, buffer.Length); 
buffer = "255 "; 
bWriter.Write(buffer.ToCharArray(), 0, buffer.Length); 

/*write data out*/ 
byte[] messageByte = Encoding.UTF8.GetBytes(ppmDataBox.Text); 
bWriter.Write(messageByte, 0, messageByte.Length); 

/*close writer and bWriter*/ 
bWriter.Close(); 
fileS.Close(); 

を次に何を私が手にすることは、私はASCIIとしてそれを、そのファイルを開いて再保存すると、私は期待してPPMを取得し、UTF-8形式で保存したファイルです。それから私は、ファイルがASCII形式で保存取得んが、ファイルが間違っている

byte[] messageByte = Encoding.ASCII.GetBytes(ppmDataBox.Text); 

byte[] messageByte = Encoding.UTF8.GetBytes(ppmDataBox.Text); 

、色が間違っていると、基本的データ:

私はラインを変更した場合

しかし ファイルのテキストボックス内のデータと一致しません。

私は、テキストボックスがUTF-8で、データを貼り付けるのは実際にはASCII形式/文字だと仮定しています。そのASCIIを対応するUTF-8に変換する必要があります。それらの文字のUTF-8バージョン)。しかし、私が完全に正直であれば、これはエンコードの世界への私の最初のベンチャーであり、私は完全に無知です。だから私がゴミを話しているかどうか教えてください。ここで

は、私は、テキストボックスに貼り付けていたデータの種類のサンプルです:

ÿÿ ÿÿ ÿÿ ÿÿ aa aa aa ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ 

どこでも小さな黒い四角と黄色であることを意味しますが、その緑色の出てくると、ときにファイルされますASCII形式で作成されたデータは、このように見える終わる:

?? ?? ?? ?? aa aa aa ?? ?? ?? ?? 

答えて

1

ASCIIは7ビット符号化である(文字127を通して0値)。 ÿ文字の値は127より大きく、正確な値はどのエンコードまたはコードページが使用されているかによって異なります。 (code page 1252の値は255です)。 ASCIIエンコーディングが127より大きい値を持つ文字を処理しようとすると、疑問符が表示されます。

高ASCII文字(128〜255文字の文字)を1バイトにマップする必要があるようです。それはUTF8UTF32またはUniCodeエンコーディングを使用して除外、そのGetBytesメソッド以来()メソッドは、1文字を複数バイトを返します単一バイトに高いASCII文字をマップするには127

より大きい値、1252年のようなコード・ページを試しますか437。それらが所望のマッピングを与えない場合、hereと記載された多くの他のコードページがある。ここで

は、コードページ1252を使用した例です:

using System; 
using System.IO; 
using System.Text; 

namespace ConsoleApplication6 
{ 
    public class Program 
    { 
    public static void Main(String[] args) 
    { 
     (new Program()).Run(); 
    } 

    public void Run() 
    { 
     this.SaveData(@"c:\temp\test.ppm", "ÿÿ ÿÿ ÿÿ ÿÿ aa aa aa ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ", 100, 200, Encoding.GetEncoding(1252)); 
    } 

    private void SaveData(String filename, String data, Int32 width, Int32 height, Encoding encoding) 
    { 
     const Int32 bufferSize = 2048; 

     Directory.CreateDirectory(Path.GetDirectoryName(filename));  

     if (Path.GetExtension(filename).ToLower() != ".ppm") 
     filename += ".ppm"; 

     using (var fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.None, bufferSize)) 
     { 
     using (var bw = new BinaryWriter(fs, encoding)) 
     { 
      var buffer = encoding.GetBytes(this.GetHeader(width, height)); 
      bw.Write(buffer); 

      buffer = encoding.GetBytes(data); 
      bw.Write(buffer); 
     } 
     } 
    } 

    private String GetHeader(Int32 width, Int32 height) 
    { 
     return String.Format("P6 {0} {1} 255 ", width, height); 
    } 
    } 
} 
+0

このコードは完璧に働いた、とも非常にきれいに書かれていた私は:)追加することができます。 bw.close()とfs.close()を追加しましたが、 がすでに存在していないことを確認して空ではありませんでした。 コードページへのリンクを提供していただきありがとうございます私はまた、ツールがエンコーディングを選択することで利益を得るという気持ちを得ています。 もう一度おねがいします。私の質問に答える時間を割いて、非常に素晴らしいC#コード – chrispepper1989

関連する問題