문자열에서 ASCII가 아닌 문자 제거


89
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

그리고 문자열에서 ASCII가 아닌 모든 문자를 제거해야합니다.

str은 "INFO] (Higashikurume)"만 포함 함을 의미합니다.

답변:


229

ASCII의 범위는 0 ~ 127이므로 다음과 같습니다.

str.replace(/[^\x00-\x7F]/g, "");

8
@AlexanderMills ASCII 테이블 검색-0에서 127 사이의 값을 가진 문자 만 유효 함을 알 수 있습니다. (0x7F는 16 진수로 127입니다). 이 코드는 ascii 범위에없는 모든 문자와 일치하여 제거합니다.
Zaffy

31

다음과 같이 긍정적 인 제거 주장으로 수행 할 수도 있습니다.

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

이것은 유니 코드를 사용합니다. Javascript에서 정규식에 대한 유니 코드를 표현할 때 문자는 이스케이프 시퀀스로 지정 \u{xxxx}되지만 플래그도 'u'있어야합니다. 정규식에는 플래그가 'gu'있습니다.

"긍정적"단언은 제거 할 문자를 표현하는 반면 "부정적"단언은 제거하지 않을 문자를 표현한다는 점에서 이것을 "제거의 긍정적 단언"이라고했습니다. 많은 맥락에서 이전 답변에서 언급했듯이 부정적인 주장은 독자에게 더 암시적일 수 있습니다. 곡절 악센트 " ^"는 "아님"을 나타내고 범위 \x00-\x7F는 "ascii"를 나타내므로 두 개가 함께 "아스키가 아님" 이라고 말합니다.

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

이는 영어에만 관심이있는 영어 사용자에게 훌륭한 솔루션이며 원래 질문에 대한 훌륭한 답변이기도합니다. 그러나 좀 더 일반적인 맥락에서 "모든 비 ASCII가 나쁘다"고 가정하는 문화적 편견을 항상 받아 들일 수는 없습니다. 비 ASCII가 사용되지만 때로는 제거해야하는 컨텍스트의 경우 유니 코드의 긍정적 인 주장이 더 적합합니다.

너비가 0이고 인쇄되지 않는 문자가 문자열에 포함되어 있다는 좋은 표시는 문자열의 "length"속성이 양수 (0이 아님)이지만 빈 문자열처럼 보이는 (즉, 다음과 같이 인쇄 됨) 경우입니다. 예를 들어, "textContent"라는 변수에 대해 Chrome 디버거에 다음과 같이 표시되었습니다.

> textContent
""
> textContent.length
7

이로 인해 그 문자열에 무엇이 있는지보고 싶었습니다.

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

이 바이트 시퀀스는 워드 프로세서에 의해 문서에 삽입 된 다음 데이터 필드로 이동하는 일부 유니 코드 문자의 계열에있는 것 같습니다. 가장 일반적으로 이러한 기호는 문서 끝에 나타납니다. 너비가 0 인 공간 "%E2%80%8B"은 CK-Editor (CKEditor)에 의해 삽입 될 수 있습니다.

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   ​  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   ‎  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   ‏  right-to-left-mark

그들에 대한 몇 가지 참조 :

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

포함 된 문자의 인코딩은 UTF-8이지만 정규식의 인코딩은 그렇지 않습니다. 문자가 UTF-8의 3 바이트 (내 경우)로 문자열에 포함되어 있지만 정규식의 명령어는 2 바이트 유니 코드를 사용해야합니다. 실제로 UTF-8은 최대 4 바이트까지 가능합니다. 표준 ASCII 인코딩을 이스케이프하기 위해 상위 비트 (또는 비트)를 사용하기 때문에 유니 코드보다 덜 간결합니다. 여기에 설명되어 있습니다.

https://en.wikipedia.org/wiki/UTF-8


3
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");IE에서 작동하지 않습니다 (최소한 IE 11). 오류와 함께 실패합니다 : SCRIPT5021 : 문자 집합의 유효하지 않은 범위
Andrey Sorich

14

다음 정규식을 사용하여 비 ASCII 문자를 바꿀 수 있습니다.

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

그러나 공백, 콜론 및 쉼표는 모두 유효한 ASCII이므로 결과는 다음과 같습니다.

> str
"INFO] :, , ,  (Higashikurume)"

나는 정규식이 좋지는 않지만 .replace () 메서드가 교체하려는 것을 취하고 .replace ( 'replace this text', 'with this text')와 같은 두 번째 매개 변수를 대체한다는 것을 알고 있습니다. 그래서 그것의 어떤 부분은 반대로하고 ascii 문자를 남기고 나머지는 제거합니다. 감사.
NicoM 2014 년

2
@NicoM 문자는 []모든 문자를 [^]의미 하지만 그 반대 를 의미합니다. 괄호 안에 있지 않은 모든 문자와 일치합니다.
Zaffy

10

이 답변 중 어느 것도 탭, 줄 바꿈, 캐리지 리턴을 올바르게 처리하지 않으며 일부는 확장 ASCII 및 유니 코드를 처리하지 않습니다. 이것은 탭과 줄 바꿈을 유지하지만 제어 문자와 ASCII 집합의 모든 것을 제거합니다. 테스트하려면 "이 코드 조각 실행"단추를 클릭하십시오. 새로운 자바 스크립트가 곧 출시 될 예정이므로 향후 (2020+?)해야 할 수도 \u{FFFFF}있지만 아직은 안됩니다.

console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))


좋은 정규식이지만 악센트와 이모티콘도 제거합니다. 이러한 경우를 다루기 위해이 정규식을 어떻게 개선할지 모르겠습니다.
Julio Vedovatto

Base64로 변환 할 때 Angular window.atob 및 DOMSanitizer.bypassSecurity ... 유효하지 않은 문자 (% 80, \ uFFFF 또는 설명되지 않은 공백)를 제거하는 가능한 솔루션을 찾는 사람에게는 이것이 작동하는 솔루션입니다
B. León

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.