[java] 유니 코드로 인코딩 된 문자열을 문자 문자열로 변환하는 방법

이스케이프 된 유니 코드 문자 가있는 문자열이 있는데 \uXXXX이를 일반 유니 코드 문자로 변환하고 싶습니다. 예를 들면 :

"\u0048\u0065\u006C\u006C\u006F World"

되어야한다

"Hello World"

첫 번째 문자열을 인쇄 할 때 이미 표시되는 것을 알고 Hello world있습니다. 내 문제는 파일에서 파일 이름을 읽은 다음 검색하는 것입니다. 파일의 파일 이름은 유니 코드 인코딩으로 이스케이프되고 파일을 검색 할 때 이름에있는 파일을 검색하기 때문에 파일을 찾을 수 없습니다 \uXXXX.



답변

기술적으로 수행 :

String myString = "\u0048\u0065\u006C\u006C\u006F World";

자동으로으로 변환 "Hello World"하므로 일부 파일의 문자열을 읽는다고 가정합니다. “Hello”로 변환하려면 텍스트를 별도의 유니 코드 숫자로 구문 분석해야합니다 (을 가져 와서 가져 오기만 \uXXXX하면됩니다 XXXX). 그런 다음 Integer.ParseInt(XXXX, 16)16 진수 값 char을 가져 와서 실제 문자를 가져 오기 위해 대소 문자를 구분해야합니다.

편집 :이를 수행하는 일부 코드 :

String str = myString.split(" ")[0];
str = str.replace("\\","");
String[] arr = str.split("u");
String text = "";
for(int i = 1; i < arr.length; i++){
    int hexVal = Integer.parseInt(arr[i], 16);
    text += (char)hexVal;
}
// Text will now have Hello


답변

아파치 코 몬즈 랭 StringEscapeUtils.unescapeJava ()는 제대로 디코딩 할 수있다.

import org.apache.commons.lang.StringEscapeUtils;

@Test
public void testUnescapeJava() {
    String sJava="\\u0048\\u0065\\u006C\\u006C\\u006F";
    System.out.println("StringEscapeUtils.unescapeJava(sJava):\n" + StringEscapeUtils.unescapeJava(sJava));
}


 output:
 StringEscapeUtils.unescapeJava(sJava):
 Hello


답변

Apache Commons LangStringEscapeUtils 에서 사용할 수 있습니다 .

String Title = StringEscapeUtils.unescapeJava("\\u0048\\u0065\\u006C\\u006C\\u006F");


답변

이 간단한 방법은 대부분의 경우에 작동하지만 문자열 “\ u0048″로 디코딩해야하지만 실제로 “H”를 디코딩하는 “u005Cu005C”와 같은 것을 넘어서서 첫 번째 패스가 작업 문자열로 “\ u0048″을 생성합니다. 그런 다음 while 루프에 의해 다시 처리됩니다.

static final String decode(final String in)
{
    String working = in;
    int index;
    index = working.indexOf("\\u");
    while(index > -1)
    {
        int length = working.length();
        if(index > (length-6))break;
        int numStart = index + 2;
        int numFinish = numStart + 4;
        String substring = working.substring(numStart, numFinish);
        int number = Integer.parseInt(substring,16);
        String stringStart = working.substring(0, index);
        String stringEnd   = working.substring(numFinish);
        working = stringStart + ((char)number) + stringEnd;
        index = working.indexOf("\\u");
    }
    return working;
}


답변

더 짧은 버전 :

public static String unescapeJava(String escaped) {
    if(escaped.indexOf("\\u")==-1)
        return escaped;

    String processed="";

    int position=escaped.indexOf("\\u");
    while(position!=-1) {
        if(position!=0)
            processed+=escaped.substring(0,position);
        String token=escaped.substring(position+2,position+6);
        escaped=escaped.substring(position+6);
        processed+=(char)Integer.parseInt(token,16);
        position=escaped.indexOf("\\u");
    }
    processed+=escaped;

    return processed;
}


답변

org.apache.commons.lang3 라이브러리의 StringEscapeUtils 는 3.6 부터 더 이상 사용되지 않습니다 .

따라서 새로운 commons-text 라이브러리를 대신 사용할 수 있습니다 .

compile 'org.apache.commons:commons-text:1.9'

OR

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-text</artifactId>
   <version>1.9</version>
</dependency>

예제 코드 :

org.apache.commons.text.StringEscapeUtils.unescapeJava(escapedString);


답변

귀하의 질문에서 완전히 명확하지는 않지만 해당 파일의 각 줄이 파일 이름 인 파일이 있다고 가정하고 있습니다. 그리고 각 파일 이름은 다음과 같습니다.

\u0048\u0065\u006C\u006C\u006F

즉, 파일 이름의 파일에있는 문자는 \, u, 0, 0, 4, 8과에 있도록.

그렇다면, 당신이보고있는 것이 예상됩니다. Java \uXXXX는 소스 코드의 문자열 리터럴의 시퀀스 만 변환 합니다 (저장된 Properties객체 에서 읽을 때 ). 당신이 내용을 읽을 때 당신이 문자로 구성된 문자열을해야합니다 파일 \, u, 0, 0, 4, 8등 및 하지 문자열 Hello.

따라서 해당 문자열을 구문 분석하여 0048, 0065등의 조각 을 추출한 다음 chars 로 변환하고 해당 chars 에서 문자열을 만든 다음 해당 문자열을 파일을 여는 루틴에 전달해야합니다.