이스케이프 된 유니 코드 문자 가있는 문자열이 있는데 \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 에서 문자열을 만든 다음 해당 문자열을 파일을 여는 루틴에 전달해야합니다.
