2013-06-02 5 views
5

문자열의 모든 유니 코드 문자가 아래 범위에 포함되면 제거하려고합니다. 자바 스크립트에서 다양한 범위의 유니 코드 문자 제거

\uD800-\uDFFF 
\u1D800-\u1DFFF 
\u2D800-\u2DFFF 
\u3D800-\u3DFFF 
\u4D800-\u4DFFF 
\u5D800-\u5DFFF 
\u6D800-\u6DFFF 
\u7D800-\u7DFFF 
\u8D800-\u8DFFF 
\u9D800-\u9DFFF 
\uAD800-\uADFFF 
\uBD800-\uBDFFF 
\uCD800-\uCDFFF 
\uDD800-\uDDFFF 
\uED800-\uEDFFF 
\uFD800-\uFDFFF 
\u10D800-\u10DFFF 

초기 프로토 타입으로, 난 그냥 replace 기능에 정규식을 사용하여 첫 번째 범위 내에서 문자를 제거하려고 노력했다.

var buffer = "he\udfffllo world"; 
var output = buffer.replace(/[\ud800-\udfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

이 경우 문자가 잘 대체 된 것처럼 보입니다. 그러나

, 내가

var buffer = "he\udfffllo worl\u1dfffd"; 
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

와 내가 예상치 못한 무언가를보고 있음을 교체합니다. \u1dff 가져 -

  1. \u1dfff 하나 개의 문자로 표시되지 않습니다 : 헬로 worl᷿fd가

    로 대체

    여기에서 주목해야 할 두 가지가 있습니다로 내 출력이 표시됩니다 문자로 변환되고 마지막에 f은 자체 문자로 처리됩니다.

  2. 결과는 빈 문자열입니다.

내가 어떻게이 작업을 수행 할 수 있는지에 대한 제안은 매우 감사하겠습니다.


편집

내 전반적인 목표는 encodeURIComponent 기능이 유효 고려 모든 문자를 필터링하는 것입니다. 나는 몇 가지 테스트를 실시하고 위의 목록이 유효하지 않은 문자 집합이라고 확인했습니다. 예를 들어, 아래 코드는 1dfff을 유니 코드 문자로 변환 한 다음 encodeURIComponent으로 전달하면 후자의 기능에 의해 예외가 발생합니다. @Blender 내가 유니 코드 문자를 표현하기 위해 x 대신 내 코드에 u의를 사용하는 것을 지적 후

var v = String.fromCharCode(122879); 
var uriComponent = encodeURIComponent(v); 

나는 질문의 일부를 편집했다.


편집 2

나는 "무효"유니 코드가 더 범위를 가져 오는 내 기술을 조사하고 밝혀 당신이보다 큰 16 비트의 숫자를 String.fromCharacterCode 주면, 그것은거야 숫자의 가장 낮은 16 비트를 봅니다. 그것은 제가보고 있던 패턴을 설명합니다. 그래서 결국, 나는 첫 번째 범위에 대해서만 걱정할 필요가 있습니다.

+0

'\ xdfff'이 \의 xdf','f'와'f''로 해석됩니다. – Blender

+0

아하 네 말이 맞아, 왜 내가 두 번째 시도에서 이상한 결과를보고 있는지 설명해. 그 부분을 지금 바꾸는 것. –

+0

'\ u1D800' 표기법과 다른 표기법의 대부분은 전혀 유효하지 않습니다. (기술적으로'\ u1D800'는 U + 1D80 다음에 0을 의미합니다.) 질문을 유니 코드 문자로 표기 해주십시오. –

답변

4

문자열에서 유니 코드 사로 게이트 코드 단위를 제거하려는 것 같습니다. 그러나 U + D800에서 U + DFFF까지만 서로 게이트 코드 포인트입니다. 사용자가 이름을 지정하는 나머지 값은 유효하지 않으며 유효한 유니 코드 문자에 할당 될 수 있습니다.이 경우, 다음 (유니 코드 문자를 참조 \u보다는 \x 사용) 충분합니다 :

buffer.replace(/[\ud800-\udfff]/g, ""); 
+0

Peter 나는 t를 편집했다. 그는 내가 제거해야하는 문자 목록을 어떻게 생각해 냈는지에 대해 더 자세한 내용을 포함하도록 질문합니다. \ x를 \ ​​u로 대체 한 후에는 구문 오류가 발생하지 않았지만 편집에 설명 된 다른 흥미로운 동작을 발견했습니다. 보고 주셔서 다시 한번 감사드립니다. –

+0

이 부분을 자세히 살펴보면, 첫 번째 범위에 대해서만 걱정할 필요가 있다는 것입니다. 질문에 대한 두 번째 편집에서 설명을 추가했습니다. –