Как удалить такого рода символы (мусор) из строки? - PullRequest
1 голос
/ 16 сентября 2008

Представьте, что у меня есть строка в C #: "Я не вижу тебя .."

Я хочу удалить (заменить на ничто и т. Д.) Эти символы «¢ ¢ â €».

Как мне это сделать?

Ответы [ 12 ]

18 голосов
/ 16 сентября 2008

Этот «мусор» очень похож на то, что кто-то интерпретировал данные 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.

3 голосов
/ 16 сентября 2008
"I Don’t see ya..".Replace( "’", string.Empty);

Как этот хлам попал туда на первое место? Это настоящий вопрос.

3 голосов
/ 16 сентября 2008

Удаляя любой нелатинский символ, вы намеренно нарушаете некоторую поддержку интернационализации.

Не забывайте бедного парня, имя которого имеет "â".

2 голосов
/ 16 сентября 2008

Если вам действительно нужно это сделать, регулярные выражения, вероятно, являются лучшим решением.

Я настоятельно рекомендую вам подумать о том, почему вы должны это делать - хотя бы некоторые из символов, которые вы перечисляете как нежелательные, вполне допустимы и полезны на других языках, и простая их фильтрация, скорее всего, будет раздражать по крайней мере некоторые из ваших международных пользователей. Как швед, я не могу особо подчеркнуть, насколько я ненавижу системы, которые не могут правильно обрабатывать наши символы å, ä и ö.

2 голосов
/ 16 сентября 2008

Это выглядит тревожно знакомым с проблемой кодировки символов, связанной с набором символов Windows, хранящимся в базе данных с использованием стандартной кодировки символов. Я вижу, кто-то проголосовал против Уилла, но у него есть смысл. Возможно, вы решаете непосредственную проблему, но комбинации символов безграничны, если это проблема.

1 голос
/ 16 сентября 2008

Regex.Replace ("Строка", "[^ a-zA-Z]", "");

Вот как вы это сделаете в C #, хотя это регулярное выражение ([^ a-zA-Z]) должно работать в большинстве языков.

[Отредактировано: забыл пробел в регулярном выражении]

1 голос
/ 16 сентября 2008

Тестируйте каждый символ по очереди, чтобы увидеть, является ли он действительным буквенным или цифровым символом, а если нет, то удалите его из строки. Тест персонажа очень прост, просто используйте ...

char.IsLetterOrDigit;

Пожалуйста, есть другие, такие как ...

char.IsSymbol;
char.IsControl;
1 голос
/ 16 сентября 2008

Рассмотрим Regex.Replace (your_string, regex, "") - вот что я использую.

0 голосов
/ 25 ноября 2014

У меня была такая же проблема с посторонним мусором, добавленным 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.halloween.exf.dif> exf.ascii.dif

0 голосов
/ 07 мая 2013

Если в строке есть какая-либо нежелательная дата, это хорошо, чтобы удалить эту нежелательную дату

     string InputString = "This is grate kingdom¢Ã‚¬â"; 
     string replace = "’";
     string OutputString= Regex.Replace(InputString, replace, "");

     //OutputString having the following result 

Это работает хорошо для меня, спасибо за просмотр этого обзора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...