




Код ASCII / целочисленный для этих символов будет вне нормального алфавитного диапазона. Искать и заменять пустыми символами. Я считаю, что String имеет метод Replace.
это простое, но не лучшее решение, я думаю. Мне нужен максимально оптимальный (самый быстрый) способ. :) но спасибо за идею.
Рассмотрим Regex.Replace (your_string, regex, "") - это то, что я использую.
хорошая идея :) Я совсем забыл про регулярное выражение :)
"I Don’t see ya..".Replace( "’", string.Empty);
Как этот хлам вообще попал туда? Это настоящий вопрос.
@HalFas, похоже, проблема с кодировкой.
К сожалению, это может быть связано с ошибками в системах с закрытым исходным кодом (например, один (и только один!) Атрибут в XML-экспорте Sparxsystems Enterprise Architect регулярно неправильно кодируется в филиале компании в Шанхае, что препятствует их изменению в модели UML, импортируемой в Франция или Англия)
По очереди проверьте каждый символ, чтобы узнать, является ли он допустимым буквенным или числовым символом, а если нет, удалите его из строки. Тест персонажа очень прост, просто используйте ...
char.IsLetterOrDigit;
Пожалуйста, есть и другие, такие как ...
char.IsSymbol;
char.IsControl;
Либо используйте черный список вещей, которые вам не нужны, либо, желательно, белый список (набор). С белым списком вы перебираете строку и копируете только буквы из белого списка в строку результата. Вы сказали удалить, и у вас есть два указателя, один из которых вы читаете из (R), а другой вы пишете в (W):
I Donââ‚
W R
если запятая находится в вашем белом списке, вы должны в этом случае прочитать запятую и записать ее, где Ã, а затем переместите оба указателя. UTF-8 - это многобайтовая кодировка, поэтому продвижение указателя может не просто добавлять к адресу.
С помощью C можно легко получить белый список, используя одну из предопределенных функций (или макросов): isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit. В этом случае вы отправляете с функцией белого списка вместо набора, конечно.
Обычно, когда я вижу данные, подобные вашим, я ищу повреждения памяти или свидетельства того, что ожидаемая кодировка отличается от той, с которой были введены данные.
/ Аллан
Это выглядит неприятно знакомым с проблемой кодировки символов, связанной с набором символов Windows, хранящимся в базе данных с использованием стандартной кодировки символов. Я вижу, что кто-то проголосовал против Уилла, но он прав. Возможно, вы решаете сиюминутную проблему, но комбинации символов безграничны, если это проблема.
Удаляя любой нелатинский символ, вы намеренно нарушаете некоторую поддержку интернационализации.
Не забывай, бедняга, в имени которого стоит буква «â».
Если вам действительно нужно это сделать, то, вероятно, лучшим решением будут регулярные выражения.
Я настоятельно рекомендую вам подумать, почему вы должны это делать - по крайней мере, некоторые из символов, которые вы указываете как нежелательные, совершенно допустимы и полезны для других языков, и простая их фильтрация, скорее всего, будет раздражать по крайней мере некоторых из ваших международные пользователи. Как швед, я не могу не подчеркнуть, насколько сильно я ненавидеть систем не может правильно обрабатывать наши символы å, ä и ö.
Этот «мусор» очень похож на интерпретацию данных UTF-8 как ISO 8859-1 или Windows-1252, возможно, неоднократно.
¢ €⠄¢ - это последовательность C3 A2, E2 82 AC, E2 84 A2.
Затем мы делаем это снова: в Windows 1252 эта последовательность - E2 80 99, поэтому символом должно быть U + 2019, ПРАВАЯ ОДИНАРНАЯ ЦИАТОВАЯ МАРКА (’)
Вы можете сделать несколько проходов с байтовыми массивами, Encoding.UTF8 и Encoding.GetEncoding (1252), чтобы правильно превратить мусор обратно в то, что было изначально введено. Вам нужно будет проверить свою обработку, чтобы найти два места, где данные UTF-8 были неправильно интерпретированы как Windows-1252.
Regex.Replace ("Строка", "[^ a-zA-Z]", "");
Именно так вы бы сделали это в C#, хотя это регулярное выражение ([^ a-zA-Z]) должно работать на большинстве языков.
[Отредактировано: забыл пробел в регулярном выражении]
Если строка имеет любую дату нежелательной почты, это хороший способ удалить эту дату нежелательной почты
string InputString = "This is grate kingdom¢Ã‚¬â";
string replace = "’";
string OutputString= Regex.Replace(InputString, replace, "");
//OutputString having the following result
У меня все работает хорошо, спасибо, что посмотрели этот обзор.
У меня была такая же проблема с посторонним мусором, добавленным 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:\news-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.halloween.exf.dif> exf.ascii.dif
Лукас: помог ли ответ Майка?