Java: как создать юникод из строки Ã и т. д.

У меня есть файл со строками, набранными вручную как Ã. Я хочу создать символ юникода, который представлен этим юникодом в java. Я пробовал, но не нашел как. Помощь.

Редактировать: когда я читаю текстовый файл, строка будет содержать «\ u00C3» не как unicode, а как символы ASCII '\' 'u' '0' '0' '3'. Я хотел бы сформировать символ Юникода из этой строки ASCII.


person Ravi    schedule 14.02.2011    source источник
comment
Как форматируется файл? Эти строки одна к строке или как?   -  person Carl Smotricz    schedule 15.02.2011
comment
Да, каждый в своей строке (извините, я не могу воспроизвести разрывы строк) ă Ą ą Ǎ   -  person Ravi    schedule 15.02.2011


Ответы (5)


Я нарыл где-то в сети:

String unescape(String s) {
    int i=0, len=s.length();
    char c;
    StringBuffer sb = new StringBuffer(len);
    while (i < len) {
        c = s.charAt(i++);
        if (c == '\\') {
            if (i < len) {
                c = s.charAt(i++);
                if (c == 'u') {
                    // TODO: check that 4 more chars exist and are all hex digits
                    c = (char) Integer.parseInt(s.substring(i, i+4), 16);
                    i += 4;
                } // add other cases here as desired...
            }
        } // fall through: \ escapes itself, quotes any character but u
        sb.append(c);
    }
    return sb.toString();
}
person Ted Hopp    schedule 14.02.2011
comment
Сработало как шарм - спасибо, я боролся добрых 4 часа. если можно, что вы искали в гугле, чтобы найти решение :) - person Ravi; 15.02.2011
comment
Насколько я помню, это было что-то вроде java unescape string - person Ted Hopp; 15.02.2011

Дэнг, я был немного медленным. Вот мое решение:

package ravi;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.Pattern;
public class Ravi {

    private static final Pattern UCODE_PATTERN = Pattern.compile("\\\\u[0-9a-fA-F]{4}");

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("ravi.txt"));
        while (true) {
            String line = br.readLine();
            if (line == null) break;
            if (!UCODE_PATTERN.matcher(line).matches()) {
                System.err.println("Bad input: " + line);
            } else {
                String hex = line.substring(2,6);
                int number = Integer.parseInt(hex, 16);
                System.out.println(hex + " -> " + ((char) number));
            }
        }
    }

}
person Carl Smotricz    schedule 14.02.2011

Наверное, что-то в этом духе:

Scanner s = new Scanner( new File("myNumbers") );
while( s.hasNextLine() ) { 
   System.out.println( 
       Character.valueOf( 
           (char)(int) Integer.valueOf(
               s.nextLine().substring(2,6), 16
            )
        )
   );
person OscarRyz    schedule 14.02.2011


Если вы хотите экранировать только юникод и ничего больше, программно вы можете создать функцию:

private String unicodeUnescape(String string) {
   return new UnicodeUnescaper().translate(string);
}

Здесь используется org.apache.commons.text.translate.UnicodeUnescaper.

person Rubén Escartín    schedule 19.01.2018