0

重複の可能性:
1 バイトの拡張 ASCII 値にエンコードする

C# では、文字列内の部分文字列を非印刷文字 (0xE0 を超えるバイト コードを持つ文字) に置き換えようとしています。反対の方向に進んでいる多くの質問を見てきました-つまり、文字列から印刷されない文字を削除しようとしていますが、印刷されていない文字を挿入しようとはしていません。以下のコード (正しく動作しません) は、私が今いる場所です:

string[] _symbol = {"Hello", "the", "man"};
string _source = "\"Hello, Hello,\" the man said.\n\"Hello,\" the woman replied.";
string _expect = "\"\xF3, \xF3,\" \xF2 \xF1 said.\n\"\xF3,\" \xF2 wo\xF1 replied.";

byte[] tblix = { 0xF3, 0x00 };
string _repl, _dest;

_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
_dest = _source.Replace(_symbol[0], _repl);

tblix[0]--;
_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
_dest = _dest.Replace(_symbol[1], _repl);

tblix[0]--;
_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
_dest = _dest.Replace(_symbol[2], _repl);

bool check = (_dest == _expect);

File.WriteAllText("temp.dat", _dest);

_expect; と同等の文字列が _dest に生成されることを期待しています。ASCII エンコーディングを使用すると、印刷されない文字が「?」に戻ります。UTF8 も正しく動作しません。さらに、出力を 1 バイト文字のシーケンスとしてファイルに書き込む必要があるため、すべてをマルチバイト エンコーディングに変換するには、最終的には 1 バイト表現に戻す必要があります。私が達成しようとしていることを行う便利な方法はありますか? ご提案いただきありがとうございます。

4

2 に答える 2

1

エンコーディングからではなく、直接charを作成します...

        string file = @"C:\Temp\temp.dat";

        string[] _symbol = { "Hello", "the", "man" };
        string _source = "\"Hello, Hello,\" the man said.\n\"Hello,\" the woman replied.";
        string _expect = "\"\xF3, \xF3,\" \xF2 \xF1 said.\n\"\xF3,\" \xF2 wo\xF1 replied.";

        //byte[] tblix = { 0xF3, 0x00 };

        char c = (char)0xF300;

        string _repl, _dest;

        //_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
        _dest = _source.Replace(_symbol[0], c.ToString());

        c -= (char)0x100;
        //_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
        _dest = _dest.Replace(_symbol[1], c.ToString());

        c -= (char)0x100;
        //_repl = System.Text.Encoding.UTF8.GetString(tblix, 0, 1);
        _dest = _dest.Replace(_symbol[2], c.ToString());

        bool check = (_dest == _expect);

        File.WriteAllText(file, _dest);

それは印刷可能な文字に変換しようとしていると思いますが、文字を作成すると、その正確な文字が直接印刷されます(またはこの場合は印刷されません)。これは、あなたからコピーして新しいコンソール アプリに挿入したコードのコピーです。あなたが言ったとおりにしました。これらの変更を加えたところ、うまくいきました。

于 2012-10-26T19:29:47.883 に答える
0

以下の変更されたコードのように、Windows-1252エンコーディングを使用してこれを機能させることができました。また、ファイルが1252エンコーディングで書き込まれていることも確認する必要がありました。

string file = @"C:\Temp\temp.dat";

string[] _symbol = { "Hello", "the", "man" };
string _source = "\"Hello, Hello,\" the man said.\n\"Hello,\" the woman replied.";
string _expect = "\"\xF3, \xF3,\" \xF2 \xF1 said.\n\"\xF3,\" \xF2 wo\xF1 replied.";
byte[] tblix = { 0xF3 };

string _repl, _dest;

Encoding e1252 = Encoding.GetEncoding(1252);
_repl = e1252.GetString(tblix);
_dest = _source.Replace(_symbol[0], _repl);

tblix[0]--;
_repl = e1252.GetString(tblix);
_dest = _dest.Replace(_symbol[1], _repl);

tblix[0]--;
_repl = e1252.GetString(tblix);
_dest = _dest.Replace(_symbol[2], _repl);

bool check = (_dest == _expect);

TextWriter tw = new StreamWriter(file, false, e1252);
tw.Write(_dest);
tw.Close();
于 2012-10-26T20:49:06.693 に答える