Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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# 将控制字符(\x1f)与字符串和/或StringBuilder一起使用_C#_Console Application - Fatal编程技术网

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

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

我只想使用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”的除外。

如果您想试试这种技巧,您可以用以下方式准确地写入所需的字节:

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