与文件名/转义序列中有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
中由循环转义的字符,这样我就不会在输出中得到双转义字符?
这些字符串中的转义数可能比您预期的要多。注意,'
在字符串中需要转义,因为它本身就是转义字符,而'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");
如果要转换转义字符串,则需要执行如下操作:
如何将包含转义字符的字符串转换为字符串