我只想使用 ASCII 单位分隔符(十进制 31 和十六进制 1F)而不是分隔文件的制表符。我认为问题出在编码上,但我确实找不到如何更改它。在下文中,我在 StreamWriter 文件的第一行输出中在控制台上获得了所需的输出,但第二行缺少“\x1f”。
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'。
最佳答案
这里似乎有很多困惑。让我看看我是否可以稍微清理一下。
首先,让我们就以下易于验证的观点达成一致:
'\x1f' == '\u001F'
'\x1f' == (char)31
'\x1f' != '▼' // <-- here appears to be your mistaken assumption.
'▼' == (char)9660
'▼' == '\u25BC'
所以这个...
// This works
Output("From▼To"); // Has a '\x1f' in it
...具有讽刺意味的是,确切的行不起作用。此字符串中没有 '\x1f'
。三角形字符不是 '\x1f'
。不确定您是从哪里得到这种印象的。
这将我们引向最后一点:'\x1f'
不是可见字符。所以当你尝试在控制台中显示它时,你将看不到它,这是 100% 正常的。
但是,请放心,当您有一个带有 '\x1f'
的字符串并将其写入文件时,该字符仍然存在。但是你永远无法“看到”它,除非你直接读取字节。
所以是否可以使用 '\x1f'
作为分隔符取决于您是否需要分隔符可见。如果是,那么您需要选择另一个角色。但是,如果您只需要它作为您以编程方式解析文件时的分隔符,那么使用 '\x1f'
是合适的。
关于c# - 将控制字符 (\x1f) 与字符串和/或 StringBuilder 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30679352/