我正在尝试获取文件名中包含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
中正确附加循环转义的字符,这样我的输出中就不会出现双转义符?
答案 0 :(得分:3)
你在这些字符串中有更多的转义,而不是你想要的。
请注意,\
需要在字符串中进行转义,因为它本身就是转义字符,而\t
表示标签。
使用NTFS的Windows完全支持unicode,因此原始错误很可能是因为您没有转义\
字符。
我写了一个玩具应用程序来处理名为ʚ.txt的文件,构造函数对该文件或任何其他unicode字符没有任何问题。
因此,您需要撰写new FileInfo("c:\testø.txt")
或new FileInfo("c:\\testø.txt")
,而不是撰写new FileInfo(@"c:\testø.txt")
。
在C#和NTFS(或者,实际上,最现代的文件系统)的上下文中,您的转义函数是完全没有必要的。外部库本身可能与unicode不兼容,但需要单独处理。
答案 1 :(得分:0)
你似乎误解了逃脱的角色。
在这个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");
如果要转换转义字符串,则需要执行以下操作:
How to convert a string containing escape characters to a string