C# 将控制字符(\x1f)与字符串和/或StringBuilder一起使用
我只想使用ASCII单位分隔符(十进制31和十六进制1F),而不是分隔文件的制表符。我认为问题在于编码,但我确实找不到如何更改它。在下面的示例中,我在StreamWriter文件的第一行输出中获得了控制台上所需的输出,但第二行缺少“\x1f”C# 将控制字符(\x1f)与字符串和/或StringBuilder一起使用,c#,console-application,C#,Console Application,我只想使用ASCII单位分隔符(十进制31和十六进制1F),而不是分隔文件的制表符。我认为问题在于编码,但我确实找不到如何更改它。在下面的示例中,我在StreamWriter文件的第一行输出中获得了控制台上所需的输出,但第二行缺少“\x1f” static StreamWriter sw = null; static void Main(string[] args) { try { sw = new StreamWriter(OutFilename, false
static StreamWriter sw = null;
static void Main(string[] args)
{
try
{
sw = new StreamWriter(OutFilename, false, Encoding.UTF8);
}
catch (Exception ex)
{
Console.WriteLine("File open error: " + ex.Message);
return;
}
// This works
Output("From▼To"); // Has a '\x1f' in it
// This does not work
StringBuilder sb = new StringBuilder();
sb.Append("From");
sb.Append('\x1f');
sb.Append("To");
Output(sb.ToString());
//
sw.Close();
}
static void Output(string s)
{
Console.WriteLine(s);
sw.WriteLine(s);
}
输出文件具有:
From▼To
FromTo
我想使用StringBuilder构建一个字符串,但输出中有“\x1f”的除外。如果您想试试这种技巧,您可以用以下方式准确地写入所需的字节:
Output(Encoding.UTF8.GetBytes(sb.ToString()));
如果您有另一个输出方法,如下所示:
static void Output(string s)
{
Console.WriteLine(s);
sw.WriteLine(s);
}
static void Output(byte[] bytes)
{
int dataLength = bytes.Length;
List<byte> modified = new List<byte>();
for (int i = 0; i < dataLength; i++)
{
if (bytes[i] == 0xBC && (i < dataLength - 1) && bytes[i + 1] == 0x25)
{
modified.Add(0x1F);
i++;
}
else
{
modified.Add(bytes[i]);
}
}
byte[] data = modified.ToArray();
Console.WriteLine(Encoding.UTF8.GetString(bytes)); // Use this or the next line
// Console.WriteLine(Encoding.UTF8.GetString(data));
sw.BaseStream.Write(data, 0, data.Length);
sw.WriteLine();
}
静态无效输出(字符串s)
{
控制台。写入线(s);
西南书写线(s);
}
静态无效输出(字节[]字节)
{
int dataLength=bytes.Length;
列表已修改=新列表();
对于(int i=0;i
这里似乎有很多困惑。让我看看能不能把事情弄清楚一些
首先,让我们就以下几点达成一致,这几点很容易验证:
'\x1f' == '\u001F'
'\x1f' == (char)31
'\x1f' != '▼' // <-- here appears to be your mistaken assumption.
'▼' == (char)9660
'▼' == '\u25BC'
。。。具有讽刺意味的是,正是这一行行不通。此字符串中没有'\x1f'
。三角形字符不是'\x1f'
。不知道你是从哪里得到这个印象的
这就引出了最后一点:“\x1f”
不是可见字符。因此,当您尝试在控制台中显示它时,您将看不到它,这是100%正常的
但是,请确保当您有一个带有'\x1f'
的字符串并将其写入文件时,该字符仍然存在。但是,除非您直接读取字节,否则您永远无法“看到”它
因此,是否可以使用'\x1f'
作为分隔符取决于是否需要该分隔符可见。如果是,则需要选择另一个角色。但是,如果您在以编程方式解析文件时只需要它作为分隔符,那么使用'\x1f'
是合适的。您确定▼代码>是否为\x1F
?因为当我检查从中返回的数组时,我得到了该字符的\x25BC
▼到“.tocharray()
请尝试\u001f
并告诉我这是否有效。x1F或u001f都不起作用,因为它们是不可打印的字符。您需要找到另一个字符,而不是用来表示该字符的箭头▼' 是十进制9660或十六进制25BC,要用作'\u25BC'@Blas Soriano,我不需要打印字符。我选择了一个明确提供的角色,以完全执行我正在执行的操作。优点是我可以肯定它永远不会在文本中被打印出来。字符确实显示在第一行的事实表明问题并不在于它没有被打印。当作为控制字符处理时,ASCII(31)被命名为“US”(单位分隔符)。我不知道在UTF8编码的文本中使用它会有什么效果,但我假设您避免在代码sw=newstreamwriter(OutFilename,false,Encoding.UTF8)中使用ASCII代码>
// This works
Output("From▼To"); // Has a '\x1f' in it