Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用非打印字符替换子字符串_C#_String_Encoding - Fatal编程技术网

C# 用非打印字符替换子字符串

C# 用非打印字符替换子字符串,c#,string,encoding,C#,String,Encoding,可能重复: 在C#中,我试图用非打印字符(字节码高于0xE0的字符)替换字符串中的子字符串。我看到很多问题都是相反的,比如试图从字符串中删除非打印字符,但不尝试插入非打印字符。下面的代码(无法正常工作)就是我现在的位置: string[] _symbol = {"Hello", "the", "man"}; string _source = "\"Hello, Hello,\" the man said.\n\"Hello,\" the woman replied."; string _exp

可能重复:

在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也不能正常工作。此外,我希望输出以单字节字符序列的形式写入文件,因此将所有内容转换为多字节编码最终需要返回单字节表示。有没有一个方便的方法来完成我想要完成的事情?提前感谢您的建议。

直接创建字符,而不是通过编码

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

我相信这是试图转换成一个可打印的字符,然而,创建字符直接强制打印该字符(在本例中不是这样)。这是我从您那里复制的代码的副本,并将其放入一个新的控制台应用程序中。正如你所说的那样,我做了这些更改,然后它工作了。

我能够使用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();

看起来你有一个,也就是说,你有一个解决方案不起作用,但我们不知道为什么它不起作用,因为我们不知道你的最终目标。我的目标是生成一个文件,其中每个字符(包括非打印字符)由一个字节表示,当我打开该文件时,我应该确切地看到_expect变量中显示的内容。但是,在Replace中使用UTF8表示会产生多字节非打印字符,而使用ASCII表示会将\127以上的所有字符转换为“?”。这确实更加简单和优雅。我看到的问题是,当我查看文件时,非打印字符仍然是多字节(UTF8)格式,但我希望每个字符只占用一个字节。@laser\u dude抱歉,我实际上没有意识到你的目标是每个字符都是单字节!