ASCII文件名中空白字符的值

时间:2013-12-09 15:04:02

标签: c# ascii indexof

我有许多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”作为最终输出。

我有什么想法或其他方法找到带有额外“空格”的文件名吗?

3 个答案:

答案 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.IsWhiteSpacestring.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)