[javascript] 문자열에서 ASCII가 아닌 문자 제거

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

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

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



답변

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

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


답변

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

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


답변

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

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

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

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


답변

이 답변 중 어느 것도 탭, 줄 바꿈, 캐리지 리턴을 올바르게 처리하지 않으며 일부는 확장 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, ''))


답변

악센트와 함께 ASCII를 사용하려면 :

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


답변