我有许多Windows 7数据文件名,在扩展名之前似乎包含空格。最终,我想消除空白,但我的直接问题是找到它们。我假设将文件名的每个字符转换为ASCII值,然后使用IndexOf,ASCII值将找到我的“空格”。然而,这是行不通的。
string name = Path.GetFileName(fileName);
Console.WriteLine(name);
byte[] ASCIIValues = Encoding.ASCII.GetBytes(name);
foreach(byte b in ASCIIValues)
Console.WriteLine(b);
if(name.IndexOf((char)63) != -1)
Console.WriteLine("Space");
else
Console.WriteLine("NO Space");
输出结果为:
XL .WL
88
76
63
46
87
76
NO Space
由于“空格”被报告为ASCII十进制63,我原本期望if写“Space”,而不是写“NO Space”。替换if中的任何其他报告的ASCII值,将“Space”作为最终输出。
我有什么想法或其他方法找到带有额外“空格”的文件名吗?
答案 0 :(得分:1)
我有许多Windows 7数据文件名,在扩展名之前似乎包含空格。最终,我想消除空格
可以这样做:
var fi = new FileInfo(fName);
var newFileName = Path.Combine(fi.DirectoryName,
Path.GetFileNameWithoutExtension(fi.Name).Trim() + fi.Extension);
答案 1 :(得分:1)
在ASCII中,63不是空格。这是问号符号:?
。实际的字母还有其他东西(你可以用(int)name[2]
找到它的值)...当打印到控制台时显示为空格的东西,并且不是ASCII兼容的,因此由虚拟字符表示, ?
,当您尝试将其编码为ASCII时。
您应该使用能够识别其他unicode空白字符的内容,例如char.IsWhiteSpace
或string.Trim
。或者,如果角色实际上不是空格,则执行其他操作来处理它,例如提供允许的字符值的白名单,并删除其余部分。
我建议您阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),了解有关文字编码的详细信息。
答案 2 :(得分:0)
使用:
name.IndexOf(' ')
而不是
name.IndexOf((char)63)