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

时间:2014-06-05 20:33:27

标签: c# unicode

我正在尝试获取文件名中包含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中正确附加循环转义的字符,这样我的输出中就不会出现双转义符?

2 个答案:

答案 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