c# - 将控制字符 (\x1f) 与字符串和/或 StringBuilder 一起使用

标签 c# console-application

我只想使用 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/

相关文章:

c# - 如果端口已被另一个应用程序占用怎么办?

c# - 来自 Console.ReadKey() 的奇怪行为

java - 多线程插入 Redshift 表导致锁定

c# - C#中如何将数组的内容打印到标签中

c# - 引用其他函数 C# 创建的实例的函数

C# 将 XML 存储到字符串中

task - 我应该使用 Task.Wait() 吗?

c - 这个 C 程序不工作

visual-studio-2010 - 在不使用控制台应用程序的情况下查看 VSTO 控制台输出

c# - Xamarin 表单图标