이스케이프 된 유니 코드 문자 가있는 문자열이 있는데 \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
등의 조각 을 추출한 다음 char
s 로 변환하고 해당 char
s 에서 문자열을 만든 다음 해당 문자열을 파일을 여는 루틴에 전달해야합니다.