C# 与文件名/转义序列中包含unicode字符的文件交互时出现问题

C# 与文件名/转义序列中包含unicode字符的文件交互时出现问题,c#,unicode,C#,Unicode,我试图获取文件名中包含unicode字符的文件的句柄 例如,我有一个名为c:\testø.txt的文件。如果我尝试newfileinfo(“c:\testø.txt”)我会得到一个非法字符异常 使用转义序列重试:newfileinfo(“c:\test\u00f8.txt”)并且可以工作!耶 所以我有一个方法来转义非ASCII字符: static string EscapeNonAsciiCharacters(string value) { StringBuilder sb = new

我试图获取文件名中包含unicode字符的文件的句柄

例如,我有一个名为
c:\testø.txt
的文件。如果我尝试
newfileinfo(“c:\testø.txt”)
我会得到一个非法字符异常

使用转义序列重试:
newfileinfo(“c:\test\u00f8.txt”)
并且可以工作!耶

所以我有一个方法来转义非ASCII字符:

static string EscapeNonAsciiCharacters(string value)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in value)
    {
        if (c > 127)
        {
            // This character is too big for ASCII
            string encodedValue = "\\u" + ((int)c).ToString("x4");
            sb.Append(encodedValue);
        }
        else
        {
            sb.Append(c);
        }
    }
    return sb.ToString();
}
但是当我从这个方法中获取输出时,转义字符似乎不正确

EscapeNonAsciiCharacters("c:\testø.txt")  ## => "c:\test\\u00f8.txt"
当我将该输出传递给
FileInfo
构造函数时,我再次得到非法字符异常。但是,
c:\
中的
\
似乎没有改变。当我在静态方法中查看StringBuilder中如何表示此字符时,我看到:
{c:est\u00f8.txt}
,这使我相信第一个反斜杠的转义方式不同


如何在
escapeNoNasciCharacters
中正确附加循环转义的字符,以便在输出中不获得双转义字符?

这些字符串中转义的字符比您可能想要的要多。 请注意,
\
在字符串中时需要转义,因为它本身就是转义字符,
\t
表示制表符

使用NTFS的Windows完全支持unicode,因此最初的错误很可能是由于您没有转义
\
字符

我编写了一个玩具应用程序来处理名为ʚ.txt的文件,构造函数对该文件或任何其他unicode字符都没有问题

因此,您需要编写
新文件信息(“c:\testø.txt”)
,而不是编写
新文件信息(“c:\\testø.txt”)
新文件信息(@“c:\testø.txt”)


在一般的C#和NTFS(或者,实际上,大多数现代文件系统)环境中,您的转义函数是完全不必要的。外部库本身可能与unicode不兼容,但这需要单独处理。

您似乎误解了转义字符

在此C代码中,编译器将
\u00f8
转换为正确的unicode字符:

new FileInfo("c:\test\u00f8.txt") // (the "\t" is actually causing an error here)
您在这里所做的只是将
encodedValue
设置为字符串
“\u00f8”
,而不会将转义字符串转换为转换后的字符串:

string encodedValue = "\\u" + ((int)c).ToString("x4");
如果要转换转义字符串,则需要执行以下操作:


新文件信息(@“C:\testø.txt”)