2014-04-07 4 views
0

나는 다음과 같은 내용의 텍스트가 (물론 코드를 참조하십시오유니 코드 서로 게이트 문자를 이스케이프?

TEXT

는 내가 뭘 할 노력하고있어 유 뒤쪽으로가 문자 \ 두 가지로)이 이모티콘 (전화 아이콘을 탈출 자사의 원래 전화 아이콘? 아래의 첫 번째 메서드는 잘 작동하지만 본질적으로 범위를 벗어나서이 같은 문자를 이스케이프 처리 할 수 ​​있습니다. 아래 첫 번째 메서드를 사용하여이 방법을 사용하는 방법을 알 수 없습니다.

어떻게 할 수 있습니까? 이 범위 기반의 이스케이프는 StringEscapeUtils와 동일한 출력으로 UnicodeEscaper를 사용합니다 (즉, \ uxx \ uxx로 이스케이프 한 다음 다시 전화 아이콘으로 이스케이프 취소).

import org.apache.commons.lang3.text.translate.UnicodeEscaper; 
import org.apache.commons.lang3.text.translate.UnicodeUnescaper; 

    String text = "Unicode surrogate here-> <--here"; 
    // escape the entire string...not what I want because there could 
    // be \n \r or any other escape chars that I want left in tact (i just want a range) 
    String text2 = org.apache.commons.lang.StringEscapeUtils.escapeJava(text); 
    System.out.println(text2); // "Unicode surrogate here-> \uD83D\uDCF1<--here" 
    // unescape it back to the phone emoticon 
    text2 = org.apache.commons.lang.StringEscapeUtils.unescapeJava(text); 
    System.out.println(text2); // "Unicode surrogate here-> <--here" 

    // How do I do the same as above but but looking for a range of chars to escape (i.e. any unicode surrogate) 
    // , which is what i want and not to escape the entire string 
    text2 = UnicodeEscaper.between(0x10000, 0x10FFFF).translate(text); 
    System.out.println(text2); // "Unicode surrogate here-> \u1F4F1<--here" 
    // unescape .... (need the phone emoticon here) 
    text2 = (new UnicodeUnescaper().translate(text2)); 
    System.out.println(text2);// "Unicode surrogate here-> ὏1<--here" 
+0

'UnicodeEscaper'란 무엇입니까? – fge

답변

2

귀하의 문자열 :

"Unicode surrogate here-> \u1F4F1<--here" 

당신이 그것을하지 생각하지 않습니다.

char은 기본적으로 UTF-16 코드 단위이므로 16 비트입니다. 여기서 일어나는 일은 \u1f41 1입니다. 그게 당신의 결과를 설명해줍니다.

여기에서 "탈출"이라고하는 것은 모르겠지만 대리모 쌍을 "\ u \ u"로 대체하는 경우 Character.toChars()을 살펴보십시오. 하나의 유니 코드 코드 포인트를 나타내는 데 필요한 char 시퀀스가 ​​BMP (한 문자) 또는 두 문자 (두 문자)에 있는지 여부를 반환합니다.

코드 포인트 U + 1f4f1의 경우 0xd83d 및 0xdcf1 문자가이 순서로 포함 된 두 요소 문자 배열을 반환합니다. 그리고 이것이 당신이 원하는 것입니다.

+0

thx, 의미가 있습니다. 그러나, 유스 케이스의 경우 \ uxxx로 "탈출 할 수있는 것"을 추적하지 않습니다. 이 문자들은 수십 가지가있을 수 있습니다. 그래서 이제는 이들을 유지하고 각각에 toChar()를 실행하지 않고 원래 텍스트로 변환하는 방법을 알아야합니다. – JaJ

+0

글쎄요, BMP 외부 문자에 대한 이스케이프 시퀀스가 ​​잘못 되었기 때문에 작동하지 않습니다;) 또한 누구를 위해/무엇에서 탈출합니까? – fge

+0

나는 모든 대리모의 범위를 벗어나고 싶다. – JaJ

2

너무 늦게 답변. 하지만 필요한 걸 찾았습니다.

org.apache.commons.lang3.text.translate.JavaUnicodeEscaper 

클래스 대신 UnicodeEscaper가 필요합니다.

Unicode surrogate here-> \uD83D\uDCF1<--here 

을 그리고 언 이스케이프는 잘 작동 :

를 사용하면, 인쇄합니다.

+0

cool .... 정보를 제공해 주셔서 감사합니다! – JaJ

관련 문제