2013-12-09 3 views
0

У меня много имен файлов данных Windows 7, которые, как представляется, содержат пробел непосредственно перед расширением. В конечном счете, я хочу устранить пробелы, но моя ближайшая проблема - найти их. Я предположил преобразование каждого символа имени файла в значение ASCII, а затем с помощью IndexOf значение ASCII найдет мое «пространство». Однако это не работает.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, я бы ожидал, что если написать «Space», а не иначе, чтобы написать «НЕТ Космос". Подставляя любые другие сообщенные значения ASCII в if, дает «Пробел» в качестве конечного вывода.

Любые идеи, что я делаю неправильно или другие способы найти имена файлов с дополнительным «пространством»?

+2

Unicode имеет множество кодовых точек для различных видов непечатаемых. В конечном счете, ваша ошибка заключается в преобразовании имени файла в ASCII. Не используйте сжатие с потерями, если вам нужно увидеть Real Thing. Кроме того, [ASCII-символ 63 является «Вопросительным знаком». Пространство 32] (http://www.asciitable.com/). – IInspectable

+3

Не принимайте ASCII. – Joe

+1

Почему вы не используете [String.IsNullOrWhiteSpace] (http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace (v = vs.110) .aspx) или [Char.IsWhiteSpace] (http://msdn.microsoft.com/en-us/library/t809ektx(v=vs.110).aspx)? Выбранная строка является строкой Unicode. Нет никакой гарантии, что вы можете преобразовать его в массив значений ASCII. –

ответ

1

У меня много имен файлов данных Windows 7, которые, как представляется, содержат пробел непосредственно перед расширением. В конце концов, я хочу, чтобы устранить пробелы

Это может быть сделано как:

var fi = new FileInfo(fName); 
var newFileName = Path.Combine(fi.DirectoryName, 
           Path.GetFileNameWithoutExtension(fi.Name).Trim() + fi.Extension); 
1

В ASCII, 63 не является пространством. Это символ знака вопроса: ?. В фактической букве есть что-то еще (вы можете найти ее значение с помощью (int)name[2]) ... что-то, что отображается как пробел при печати на консоли и не совместимо с ASCII, и поэтому представлено фиктивным символом, ?, когда вы попробуйте кодировать его как ASCII.

Вы должны использовать что-то, что известно о других пробельных символах юникода, например char.IsWhiteSpace или string.Trim. Или, если символ на самом деле не является пробелом, сделайте что-нибудь еще для его обработки, например. введите белый список допустимых значений символов и разделите остальные.

Я бы рекомендовал вам прочитать The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) для более подробной информации о кодировании текста.

0

Использование:

name.IndexOf(' ') 

вместо

name.IndexOf((char)63) 
Смежные вопросы