与文件名/转义序列中有unicode字符的文件交互

本文关键字:字符 文件 交互 unicode 文件名 转义序列 | 更新日期: 2023-09-27 18:06:53

我正试图抓住一个在文件名中具有unicode字符的文件的句柄。

例如,我有一个名为c:'testø.txt的文件。如果我尝试new FileInfo("c:'testø.txt"),我得到一个非法字符异常。

再次尝试转义序列:new FileInfo("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},这使我相信第一个反斜杠以不同的方式转义。

我怎样才能正确地附加在EscapeNonAsciiCharacters中由循环转义的字符,这样我就不会在输出中得到双转义字符?

与文件名/转义序列中有unicode字符的文件交互

这些字符串中的转义数可能比您预期的要多。注意,'在字符串中需要转义,因为它本身就是转义字符,而't表示制表符。

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

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

所以,你需要写new FileInfo("c:''testø.txt")new FileInfo(@"c:'testø.txt"),而不是写new FileInfo("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");

如果要转换转义字符串,则需要执行如下操作:

如何将包含转义字符的字符串转换为字符串