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抱歉,我实际上没有意识到你的目标是每个字符都是单字节!