2008-09-16 3 views

ответ

18

Этот «мусор» очень похож на тех, кто интерпретировал данные UTF-8 как ISO 8859-1 или Windows-1252, возможно, неоднократно.

à ¢ â, ¬â "¢ представляет собой последовательность C3 A2, E2 82 AC, E2 84 A2.

  • UTF-8, С3 А2 = U + 00E2 = A
  • UTF-8 Е2 82 АС = U + 20AC = €
  • UTF-8, Е2 84 A2 = U + 2122 = ™

затем мы делаем это снова: в Windows 1252 эта последовательность E2 80 99, так что символ должен быть U + 2019, ПРАВАЯ одиночная кавычка (')

Вы можете сделать несколько проходов с байтовыми массивами, кодирование .UTF8 и Encoding.GetEncoding (1252), чтобы правильно повернуть барабан ba ck в то, что изначально было введено. Вам нужно будет проверить свою обработку, чтобы найти два места, которые UTF-8 были неправильно интерпретированы как Windows-1252.

0

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

+0

Это легко, но не лучшее решение, я думаю. Мне нужен как оптимальный (самый быстрый) способ, каким он может быть. :) но спасибо за идею. – 2008-09-16 14:16:28

1

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

+0

хорошая идея :) Я совсем забыл о регулярном выражении :) – 2008-09-16 14:17:35

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

Как этот мусор попал туда на первое место? Это реальный вопрос.

+0

«очень смешно» :) – 2008-09-16 14:18:06

1

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

char.IsLetterOrDigit; 

Пожалуйста, существуют различные другие, такие как ...

char.IsSymbol; 
char.IsControl; 
0

Либо использовать черный список вещей вы не хотите, или, предпочтительно, белый список (набор). С белым списком вы перебираете строку и копируете только буквы, которые находятся в вашем белом списке, в строку результатов. Вы сказали, что удалить, и как вы делаете, что имея два указатель, который вы считанные из (R) и один вы пишете (W):

I Donâ₠
    W R 

если запятая в белом списке, то вы бы в этом случае читать запятая и напишите, где Ã затем продвигает оба указателя. UTF-8 является многобайтовой кодировкой, поэтому вы продвигаете указатель, возможно, не просто добавляете адрес.

С помощью C легко получить белый список, используя одну из предопределенных функций (или макросов): isalnum, isalpha, isascig, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper , isxdigit. В этом случае вы отправляете с белым списком функцию вместо набора конечно.

Обычно, когда я вижу такие данные, как у вас, я искал повреждение памяти или данные, свидетельствующие о том, что ожидаемое кодирование отличается от того, с которым были введены данные.

/Allan

2

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

3

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

Не забывайте, что бедный парень, у которого есть имя, имеет «â» в нем.

2

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

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

1

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

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

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

0

Если строка, имеющая дату любого нежелательной, это хорошо способом удалить эту Дату Нежелательной

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

//OutputString having the following result 

Это работает хорошо для меня.

0

У меня была такая же проблема с посторонним мусором, брошенным 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

Смежные вопросы