문자열에서 이러한 종류의 기호(정크)를 제거하는 방법은 무엇입니까?

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, regex, "")를 고려해보세요. 이것이 제가 사용하는 것입니다.

각 문자를 차례로 테스트하여 유효한 알파벳 또는 숫자인지 확인하고, 그렇지 않은 경우 문자열에서 제거합니다.캐릭터 테스트는 매우 간단합니다. 그냥 사용하세요...

char.IsLetterOrDigit;

다음과 같은 다양한 다른 것들이 있기를 바랍니다.

char.IsSymbol;
char.IsControl;

Regex.Replace("문자열", "[^a-zA-Z ]","");

정규식([^a-zA-Z ])은 대부분의 언어에서 작동하지만 이것이 C#에서 수행하는 방법입니다.

[수정됨:정규식에서 공백을 잊어버렸습니다.]

이러한 문자의 ASCII/정수 코드는 일반 알파벳 범위를 벗어납니다.빈 문자를 찾아서 바꿉니다.문자열에는 내가 믿는 바꾸기 메서드가 있습니다.

원하지 않는 항목의 블랙리스트를 사용하거나 바람직하게는 화이트 리스트(세트)를 사용하십시오.화이트리스트를 사용하면 문자열을 반복하고 화이트리스트에 있는 문자만 결과 문자열에 복사합니다.제거라고 하셨는데, 그렇게 하는 방법은 두 개의 포인터를 갖는 것입니다. 하나는 (R)에서 읽고 다른 하나는 (W)에 쓰는 것입니다.

I Donââ‚
     W  R

쉼표가 화이트리스트에 있으면 이 경우 쉼표를 읽고 Ã 위치에 쓴 다음 두 포인터를 모두 전진시킵니다.UTF-8은 멀티바이트 인코딩이므로 포인터를 전진시키는 것이 단순히 주소를 추가하는 것이 아닐 수도 있습니다.

C에서는 미리 정의된 함수(또는 매크로) 중 하나를 사용하여 화이트리스트를 얻는 쉬운 방법이 있습니다.isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit.이 경우 물론 세트 대신 화이트리스트 기능을 보내드립니다.

일반적으로 나는 당신과 같은 데이터를 볼 때 메모리 손상이나 내가 기대하는 인코딩이 데이터에 입력된 인코딩과 다르다는 증거를 찾습니다.

/앨런

EXIF 덤프에서 Adobe에 의해 던져진 외부 정크와 동일한 문제가 있었습니다.나는 한 시간 동안 정답을 찾고 여기서는 효과가 없는 수많은 설익은 제안을 시도했습니다.

내가 읽은 대부분의 스레드보다 이 스레드는 '어떻게 거기까지 갔을까?', '누군가 이름에 이 문자가 있으면 어떻게 됩니까?', '국제화를 깨고 싶습니까?'와 같은 심오하고 탐구적인 질문으로 가득 차 있었습니다.

이 쓰레기가 어떻게 여기까지 올 수 있었는지 가정하고 다양한 문자 인코딩 체계의 진화를 설명하는 박식한 인상적인 전시가 있었습니다.그 사람은 이 퀴즈가 흥미로울 수 있기 때문에 그것이 어떻게 생겨났는지 또는 표준 조직이 무엇을 하고 있는지가 아니라 그것을 제거하는 방법을 알고 싶어했습니다.

나는 나에게 올바른 답을 주는 작은 프로그램을 작성했습니다.주요 개념을 다른 말로 표현하는 대신, 여기에는 독립적이고 작동하는 전체 프로그램(적어도 내 시스템에서는)과 내가 정크를 핵무기로 만드는 데 사용한 출력이 있습니다.

#!/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

문자열에 정크 날짜가 있는 경우 해당 정크 날짜를 제거하는 것이 좋습니다.

     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