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

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

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

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

Лукас: помог ли ответ Майка?

Mark 03.05.2009 20:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
11 596
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Код ASCII / целочисленный для этих символов будет вне нормального алфавитного диапазона. Искать и заменять пустыми символами. Я считаю, что String имеет метод Replace.

это простое, но не лучшее решение, я думаю. Мне нужен максимально оптимальный (самый быстрый) способ. :) но спасибо за идею.

Lukas Šalkauskas 16.09.2008 18:16

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

хорошая идея :) Я совсем забыл про регулярное выражение :)

Lukas Šalkauskas 16.09.2008 18:17

"I Don’t see ya..".Replace( "’", string.Empty);

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

@HalFas, похоже, проблема с кодировкой.

Chris Broadfoot 16.09.2008 18:35

К сожалению, это может быть связано с ошибками в системах с закрытым исходным кодом (например, один (и только один!) Атрибут в XML-экспорте Sparxsystems Enterprise Architect регулярно неправильно кодируется в филиале компании в Шанхае, что препятствует их изменению в модели UML, импортируемой в Франция или Англия)

Pete Kirkham 30.01.2010 14:38

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

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.

  • 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.

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

Другие вопросы по теме