Как удалить такого рода символы (мусор) из строки?

StackOverflow https://stackoverflow.com/questions/72677

  •  09-06-2019
  •  | 
  •  

Вопрос

Представьте, что у меня есть строка в 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 

У меня все хорошо работает, спасибо, что посмотрели этот отзыв.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top