Представьте меня есть строки в C#: «Я Donà ¢ â, ¬ A«¢ т увидимся .. „Как удалить эти символы (мусор) из строки?
Я хочу удалить (заменить ничего или и т.д.) эти“ Ã ¢ â, ¬ A « ¢ ".
Как это сделать?
Представьте меня есть строки в C#: «Я Donà ¢ â, ¬ A«¢ т увидимся .. „Как удалить эти символы (мусор) из строки?
Я хочу удалить (заменить ничего или и т.д.) эти“ Ã ¢ â, ¬ A « ¢ ".
Как это сделать?
Этот «мусор» очень похож на тех, кто интерпретировал данные UTF-8 как ISO 8859-1 или Windows-1252, возможно, неоднократно.
à ¢ â, ¬â "¢ представляет собой последовательность C3 A2, E2 82 AC, E2 84 A2.
затем мы делаем это снова: в Windows 1252 эта последовательность E2 80 99, так что символ должен быть U + 2019, ПРАВАЯ одиночная кавычка (')
Вы можете сделать несколько проходов с байтовыми массивами, кодирование .UTF8 и Encoding.GetEncoding (1252), чтобы правильно повернуть барабан ba ck в то, что изначально было введено. Вам нужно будет проверить свою обработку, чтобы найти два места, которые UTF-8 были неправильно интерпретированы как Windows-1252.
Код ASCII/Целочисленный для этих символов был бы вне нормальных алфавитных диапазонов. Ищите и заменяйте пустые символы. Я считаю, что у String есть метод Replace.
Это легко, но не лучшее решение, я думаю. Мне нужен как оптимальный (самый быстрый) способ, каким он может быть. :) но спасибо за идею. – 2008-09-16 14:16:28
Рассмотрим Regex.Replace (your_string, regex, "") - вот что я использую.
хорошая идея :) Я совсем забыл о регулярном выражении :) – 2008-09-16 14:17:35
"I Don’t see ya..".Replace("’", string.Empty);
Как этот мусор попал туда на первое место? Это реальный вопрос.
«очень смешно» :) – 2008-09-16 14:18:06
Проверяйте каждый символ поочередно, чтобы увидеть, является ли он действительным буквенным или числовым символом, а если нет, то удалите его из строки. Тест символ очень прост, просто использовать ...
char.IsLetterOrDigit;
Пожалуйста, существуют различные другие, такие как ...
char.IsSymbol;
char.IsControl;
Либо использовать черный список вещей вы не хотите, или, предпочтительно, белый список (набор). С белым списком вы перебираете строку и копируете только буквы, которые находятся в вашем белом списке, в строку результатов. Вы сказали, что удалить, и как вы делаете, что имея два указатель, который вы считанные из (R) и один вы пишете (W):
I Donââ‚
W R
если запятая в белом списке, то вы бы в этом случае читать запятая и напишите, где Ã затем продвигает оба указателя. UTF-8 является многобайтовой кодировкой, поэтому вы продвигаете указатель, возможно, не просто добавляете адрес.
С помощью C легко получить белый список, используя одну из предопределенных функций (или макросов): isalnum, isalpha, isascig, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper , isxdigit. В этом случае вы отправляете с белым списком функцию вместо набора конечно.
Обычно, когда я вижу такие данные, как у вас, я искал повреждение памяти или данные, свидетельствующие о том, что ожидаемое кодирование отличается от того, с которым были введены данные.
/Allan
Это выглядит пугающе знакомым с вопросом кодировки символов дело с характером Windows, набор хранится в базе данных, используя стандартную кодировку. Я вижу, что кто-то проголосовал за Уилла, но у него есть точка. Возможно, вы решаете немедленную проблему, но комбинации символов безграничны, если это проблема.
Удаляя любого нелатинского персонажа, вы намеренно нарушаете некоторую поддержку интернационализации.
Не забывайте, что бедный парень, у которого есть имя, имеет «â» в нем.
Если вам действительно нужно это сделать, регулярные выражения, вероятно, являются лучшим решением.
Я бы настоятельно рекомендовал вам подумать о том, почему вы должны это сделать, хотя, по крайней мере, некоторые из символов, которые вы перечисляете как нежелательные, являются действительно действительными и полезными на других языках, и просто их фильтрация, скорее всего, будет раздражать хотя бы некоторые из ваших международных пользователей. В качестве швеи я не могу особо подчеркнуть, насколько я ненавижу системы, которые не могут правильно обрабатывать наши символы å, ä и ö.
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:\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
Lukas: сделал ответ помощь Майка? – Mark 2009-05-03 16:23:57