C# 与文件名/转义序列中包含unicode字符的文件交互时出现问题
我试图获取文件名中包含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
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”)谢谢,我觉得我找错人了。我仍然需要逃避一些东西,以便将它们传递给与之交互的API,但这是另一个问题。干杯。对于未来的读者,我根据你的评论添加了一个澄清。祝你好运。