0

可能重复:
编码为单字节扩展 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);

我期望在 _dest 中产生一个相当于 _expect 的字符串;如果我使用 ASCII 编码,非打印字符将恢复为“?”。UTF8 也不能正常工作。此外,我希望将输出作为单字节字符序列写入文件,因此将所有内容转换为多字节编码最终需要返回单字节表示。有没有一种方便的方法来做我想要完成的事情?在此先感谢您的任何建议。

4

2 回答 2

1

直接创建字符,而不是从编码...

        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);

我相信这是试图转换为可打印的字符,而创建 char 会直接强制打印确切的字符(或在这种情况下不打印)。这是我从您那里复制并放入新控制台应用程序的代码的副本。完全按照你说的做了,我做了这些改变,然后它就起作用了。

于 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 回答