2012-11-02 6 views
1

Basic Multilingual Plane의 문자는 '\ uxxxx'를 사용하여 이스케이프 처리 할 수 ​​있습니다. 예를 들어/[\ u4e00- \ u9fff] /를 사용하여 일반적인 한자와 일치시킬 수 있습니다 (0x4e00-0x9fff는 CJK 통합 표상의 범위입니다).Basic Multilingual Plane에서 문자를 벗어나는 방법은 무엇입니까?

그러나 기본 다국어 표준을 벗어난 문자의 경우 코드가 0xffff보다 큽니다. 따라서 '\ u20000'은 '\ u2000'문자와 '0'문자를 의미하기 때문에 '\ uxxxx'형식을 사용할 수 없습니다. 문자는 0x20000입니다.

어떻게 기본 다국어 표준 문자를 벗어날 수 있습니까? 대부분의 글꼴에 표시 할 수 없기 때문에 이러한 문자를 직접 사용하는 것은 좋지 않습니다.

+0

@millimoose 어,하지만이 질문에 대한 내용은 ** javascript **, java가 아닙니다. – user805627

+0

오, 내 잘못입니다.(당신은 아마 그곳에 망쳐 놓은 것처럼 보일 것입니다.) 더 이상 그렇지 않다면 – millimoose

+0

관련 내용 : [BMP 외부의 JavaScript 문자열] (http://stackoverflow.com/questions/3744721/javascript-strings-outside-of-the -bmp) – millimoose

답변

1

당신은 탈출 대리 코드 점 쌍을 사용할 수 있습니다. 표기법 (버튼 "표시 \ u")을 얻으려면 Full Unicode input utility을 사용하고, Fileformat.info character search을 사용하여 찾을 수 있습니다 (JavaScript는 여기에서 같은 표기법을 사용하기 때문에 항목 "C/C++/Java 소스 코드").

다른 방법으로 문자를 직접 입력 할 수도 있습니다. "과 같이을 JavaScript 코드의 문자열 리터럴에 별도의 파일이나 HTML에 포함 된 형식으로 입력 할 수 있습니다. 당연히, 사용하는 편집기에서 적절한 유니 코드 지원이 필요합니다. 그러나 JavaScript 구현은 프로그램 소스에서 비 BMP 문자를 지원할 필요가 없습니다. (JavaScript와 Globalize.js의 Going Global, 177 쪽) 문자 인코딩을 올바르게 선언하는 것과 같은 몇 가지주의 사항이 있습니다.

글꼴 지원은 다른 문제이지만 문자로 작업 할 때 일반적으로 어쨌든 적어도 테스트 할 때 글꼴을 지원합니다. 따라서 문자를 덮는 글꼴이 어느 정도 필요합니다. Fileformat.info 페이지에는 브라우저 지원 정보 (예 : (U+20000) Font Support)에 대한 링크가 포함되어 있습니다. 예를 들어, U + 20000 ''은 SimSun-ExtB에서도 지원됩니다.

2

BMP 외부의 문자는 Javascript에서 직접 인식되지 않습니다. 내부적으로 UTF-16 서로 게이트 쌍으로 표시됩니다. 예를 들어, 당신이 언급 한 캐릭터 인 U + 20000 (현재 "CJK Unified Ideographs Ext. B"에 할당 됨)은 서로 게이트 쌍 U + D840 U + DC00으로 표현됩니다. Javascript 문자열로, 이것은 단순히 "\u2840\uDC00"이됩니다. (이것은 하나의 문자로 표시에도 불구하고, s.length이 문자열이 있음을 유의하십시오.) @의 duskwuff의 대답에 설명 된대로

Wikipedia has details on the encoding scheme used.

0

흥미로운 문제입니다. 이제 우리는 ES6을 가지고

, we can do this : 내부적으로는 surrogate pairs 여전히 UTF-16

let newSpeak = '\u{1F4A9}' 

참고 :

newSpeak.length === 2 // "wrong" 
[...newSpeak].length === 1 
newSpeak === '\uD83D\uDCA9' 

Unicode is huge.

또한, 단지 리터럴이 아니다 : 나는 유니 코드를 처리

newSpeak.charCodeAt(0) === 0xD83D // "wrong" 
newSpeak.codePointAt(0) === 0x1F4A9 

String.fromCharCode(0x1F4A9) !== newSpeak 
String.fromCodePoint(0x1F4A9) === newSpeak 

for (let i = 0; i < newSpeak.length; i++) console.log(newSpeak[i]) // "wrong" 
for (let c of newSpeak) console.log(c) 

[...''].map(c => `__${c}`).join('') === "____" 

.