Как удалить такого рода символы (мусор) из строки?
Вопрос
Представьте, что у меня есть строка в C#:"Я тебя не вижу..."
Я хочу удалить (заменить на ничто или т.д.) Эти символы "¢".
Как мне это сделать?
Решение
Этот "мусор" очень похож на то, что кто-то интерпретировал данные UTF-8 как ISO 8859-1 или Windows-1252, вероятно, неоднократно.
- это последовательность C3 A2, E2 82 AC, E2 84 A2.
- UTF-8 C3 A2 = U+00E2 = â
- UTF-8 E2 82 AC = U + 20AC = €
- UTF-8 E2 84 A2 = U+2122 = ™
Затем мы делаем это снова:в Windows 1252 эта последовательность равна E2 80 99, поэтому символом должен был быть U + 2019, ПРАВАЯ ОДИНАРНАЯ КАВЫЧКА (’)
Вы могли бы выполнить несколько проходов с массивами байтов, Encoding.UTF8 и Encoding.GetEncoding(1252), чтобы корректно преобразовать мусор обратно в то, что было введено изначально.Вам нужно будет проверить вашу обработку, чтобы найти два места, где данные UTF-8 были неправильно интерпретированы как Windows-1252.
Другие советы
"I Don’t see ya..".Replace( "’", string.Empty);
Во-первых, как этот хлам туда попал?Вот в чем настоящий вопрос.
Удаляя любые нелатинские символы, вы намеренно нарушаете некоторую поддержку интернационализации.
Не забывай о бедняге, в имени которого есть буква "а".
Это выглядит тревожно знакомой проблемой с кодировкой символов, связанной с набором символов Windows, хранящимся в базе данных с использованием стандартной кодировки символов.Я вижу, кто-то проголосовал против Уилла, но в его словах есть смысл.Возможно, вы решаете непосредственную проблему, но комбинации символов безграничны, если проблема именно в этом.
Если вам действительно нужно это сделать, регулярные выражения, вероятно, являются лучшим решением.
Я бы настоятельно рекомендовал вам подумать о том, почему вы должны это делать - по крайней мере, некоторые символы, которые вы указываете как нежелательные, вполне допустимы и полезны на других языках, и простая их фильтрация, скорее всего, вызовет раздражение по крайней мере у некоторых ваших международных пользователей.Как швед, я не могу достаточно подчеркнуть, насколько я ненависть системы, которые не могут корректно обрабатывать наши символы "о", "а" и "о".
Рассмотрим Regex.Replace(your_string, регулярное выражение, "") - это то, что я использую.
Проверьте каждый символ по очереди, чтобы узнать, является ли он допустимым буквенным или цифровым символом, и если нет, то удалите его из строки.Тест на характер очень прост, просто используйте...
char.IsLetterOrDigit;
Пожалуйста, есть и другие варианты, такие как...
char.IsSymbol;
char.IsControl;
Регулярное выражение.Заменить("Строка", "[^a-zA-Z ]","");
Именно так вы бы сделали это на C #, хотя это регулярное выражение ([^a-zA-Z ]) должно работать на большинстве языков.
[Отредактировано:забыл пробел в регулярном выражении]
Код ASCII / Integer для этих символов будет выходить за пределы обычных алфавитных диапазонов.Ищите и заменяйте пустыми символами.Я полагаю, у String есть метод замены.
Либо используйте черный список того, что вам не нужно, либо, предпочтительно, белый список (set).С помощью белого списка вы выполняете итерацию по строке и копируете в результирующую строку только те буквы, которые есть в вашем белом списке.Вы сказали удалить, и способ, которым вы это делаете, заключается в наличии двух указателей, один из которых вы читаете из (R), а другой вы записываете в (W):
I Donââ‚
W R
если запятая есть в вашем белом списке, то в этом случае вы бы прочитали запятую и записали ее там, где находится, а затем переместили оба указателя.UTF-8 - это многобайтовая кодировка, поэтому вы, перемещая указатель, можете не просто добавлять его к адресу.
С помощью C можно легко получить белый список, используя одну из предопределенных функций (или макросов).:isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit.В этом случае вы отправляете запрос с функцией белого списка вместо набора курсов.
Обычно, когда я вижу такие данные, как у вас, я ищу повреждение памяти или доказательства того, что кодировка, которую я ожидаю, отличается от той, с которой были введены данные.
/Аллан
У меня была такая же проблема с посторонним мусором, добавленным adobe в дамп EXIF.Я потратил час на поиски прямого ответа и перепробовал множество непродуманных предложений, которые здесь не сработали.
Эта тема больше, чем большинство прочитанных мной, изобиловала глубокими, наводящими на размышления вопросами типа "как это туда попало?", "что, если у кого-то в имени есть этот символ?", "вы уверены, что хотите нарушить интернационализацию?".
Было несколько впечатляющих проявлений эрудиции, объясняющих, как этот мусор мог сюда попасть, и объясняющих эволюцию различных схем кодирования символов.Человек хотел знать, как это удалить, а не как это появилось или каковы стандарты организаций, какими бы интересными ни были эти мелочи.
Я написал крошечную программу, которая дала мне правильный ответ.Вместо того, чтобы перефразировать основную концепцию, вот полная, автономная, работающая (по крайней мере, в моей системе) программа и выходные данные, которые я использовал для удаления мусора:
#!/usr/local/bin/perl -w
# This runs in a dos window and shows the char, integer and hex values
# for the weird chars. Install the HEX values in the REGEXP below until
# the final test line looks normal.
$str = 's: “Brian'; # Nuke the 3 werid chars in front of Brian.
@str = split(//, $str);
printf("len str '$str' = %d, scalar \@str = %d\n",
length $str, scalar @str);
$ii = -1;
foreach $c (@str) {
$ii++;
printf("$ii) char '$c', ord=%03d, hex='%s'\n",
ord($c), unpack("H*", $c));
}
# Take the hex characters shown above, plug them into the below regexp
# until the junk disappears!
($s2 = $str) =~ s/[\xE2\x80\x9C]//g; # << Insert HEX values HERE
print("S2=>$s2<\n"); # Final test
Result:
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
len str 's: GÇ£Brian' = 11, scalar @str = 11
0) char 's', ord=115, hex='73'
1) char ':', ord=058, hex='3a'
2) char ' ', ord=032, hex='20'
3) char 'G', ord=226, hex='e2'
4) char 'Ç', ord=128, hex='80'
5) char '£', ord=156, hex='9c'
6) char 'B', ord=066, hex='42'
7) char 'r', ord=114, hex='72'
8) char 'i', ord=105, hex='69'
9) char 'a', ord=097, hex='61'
10) char 'n', ord=110, hex='6e'
S2=>s: Brian<
Это НОРМАЛЬНО!!!
Еще одно действенное, рабочее предложение, с которым я столкнулся:iconv -c -t ASCII < 6s-2014.1031-238246.хэллоуин.exf.dif > exf.ascii.dif
Если строка содержит какую-либо нежелательную дату, это полезно для удаления этой нежелательной даты
string InputString = "This is grate kingdom¢Ã‚¬â";
string replace = "’";
string OutputString= Regex.Replace(InputString, replace, "");
//OutputString having the following result
У меня все хорошо работает, спасибо, что посмотрели этот отзыв.