Преобразование международных строк в \ u коды в Java - PullRequest
45 голосов
/ 03 июня 2011

Как преобразовать международную (например, русскую) строку в \u числа (номера Unicode)
например \u041e\u041a для OK?

Ответы [ 11 ]

50 голосов
/ 24 сентября 2013

существует JDK tools , выполняемое через командную строку следующим образом:

native2ascii -encoding utf8 src.txt output.txt

Пример:

src.txt

بسم الله الرحمن الرحيم

output.txt

\u0628\u0633\u0645 \u0627\u0644\u0644\u0647 \u0627\u0644\u0631\u062d\u0645\u0646 \u0627\u0644\u0631\u062d\u064a\u0645

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

String pathSrc = "./tmp/src.txt";
String pathOut = "./tmp/output.txt";
String cmdLine = "native2ascii -encoding utf8 " + new File(pathSrc).getAbsolutePath() + " " + new File(pathOut).getAbsolutePath();
Runtime.getRuntime().exec(cmdLine);
System.out.println("THE END");

Затем прочитайте содержимое нового файла.

22 голосов
/ 03 июня 2011

Вы можете использовать escapeJavaStyleString из org.apache.commons.lang.StringEscapeUtils.

14 голосов
/ 08 декабря 2014

Вот улучшенная версия Ответ ArtB :

    StringBuilder b = new StringBuilder();

    for (char c : input.toCharArray()) {
        if (c >= 128)
            b.append("\\u").append(String.format("%04X", (int) c));
        else
            b.append(c);
    }

    return b.toString();

Эта версия экранирует все символы, не относящиеся к ASCII, и корректно работает для кодовых точек с низким Юникодом, таких как Ä.

14 голосов
/ 14 мая 2012

У меня тоже была эта проблема. У меня был какой-то португальский текст с некоторыми специальными символами, но эти символы были уже в формате Юникод (например: \u00e3).

Итак, я хочу преобразовать S\u00e3o в São.

Я сделал это с помощью Apache Commons StringEscapeUtils . Как сказал @ сорин-сбарнеа. Можно скачать здесь .

Используйте метод unescapeJava, например:

String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);

(Существует также метод escapeJava, но этот помещает символы Unicode в строку.)

Если кто-нибудь знает решение на чистой Java, сообщите нам.

11 голосов
/ 03 июня 2011

Ответ состоит из трех частей

  1. Получить код Unicode для каждого символа
  2. Определить, находится ли он на странице кириллицы
  3. Преобразовать в шестнадцатеричное.

Чтобы получить каждый символ, вы можете перебрать строку, используя методы charAt() или toCharArray().

for( char c : s.toCharArray() )

Значение char является значением Unicode.

Символ кириллицы - это любой символ в следующих диапазонах:

Cyrillic:            U+0400–U+04FF ( 1024 -  1279)
Cyrillic Supplement: U+0500–U+052F ( 1280 -  1327)
Cyrillic Extended-A: U+2DE0–U+2DFF (11744 - 11775)
Cyrillic Extended-B: U+A640–U+A69F (42560 - 42655)

Если он находится в этом диапазоне, он является кириллицей.Просто выполните проверку, если.Если он находится в диапазоне, используйте Integer.toHexString() и добавьте "\\u".Все вместе это должно выглядеть примерно так:

final int[][] ranges = new int[][]{ 
        {  1024,  1279 }, 
        {  1280,  1327 }, 
        { 11744, 11775 }, 
        { 42560, 42655 },
    };
StringBuilder b = new StringBuilder();

for( char c : s.toCharArray() ){
    int[] insideRange = null;
    for( int[] range : ranges ){
        if( range[0] <= c && c <= range[1] ){
            insideRange = range;
            break;
        }
    }

    if( insideRange != null ){
        b.append( "\\u" ).append( Integer.toHexString(c) );
    }else{
        b.append( c );
    }
}

return b.toString();

Редактировать: , вероятно, следует выполнить проверку c < 128 и повернуть тела if и else;вы вероятно должны избежать всего, что не является ASCII.Я был, вероятно, слишком буквальным в моем чтении вашего вопроса.

8 голосов
/ 03 июня 2011

Если вам нужно написать файл .properties, вы можете просто добавить Strings в объект Properties и затем сохранить его в файл. Он позаботится о преобразовании.

7 голосов
/ 03 июня 2011

Существует инструмент командной строки, который поставляется с Java, который называется native2ascii . Это преобразует файлы Unicode в ASCII-экранированные файлы. Я обнаружил, что это необходимый шаг для создания файлов .properties для локализации.

4 голосов
/ 18 июля 2016

Apache commons StringEscapeUtils.escapeEcmaScript(String) возвращает строку с символами Юникода, экранированную с использованием нотации \u.

"Art of Beer ? ?" -> "Art of Beer \u1F3A8 \u1F37A"
1 голос
/ 27 декабря 2018

Существует Java-библиотека с открытым исходным кодом MgntUtils, в которой есть утилита, которая преобразует строки в последовательность Unicode и наоборот:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

Вывод этого кода:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

Библиотека может быть найдена в Maven Central или в Github Она поставляется в виде артефакта Maven с исходными кодами и javadoc

Вот javadoc для класса StringUnicodeEncoderDecoder

0 голосов
/ 09 февраля 2018

Просто несколько основных методов для этого (по мотивам инструмента native2ascii):

/**
 * Encode a String like äöü to \u00e4\u00f6\u00fc
 * 
 * @param text
 * @return
 */
public String native2ascii(String text) {
    if (text == null)
        return text;
    StringBuilder sb = new StringBuilder();
    for (char ch : text.toCharArray()) {
        sb.append(native2ascii(ch));
    }
    return sb.toString();
}

/**
 * Encode a Character like ä to \u00e4
 * 
 * @param ch
 * @return
 */
public String native2ascii(char ch) {
    if (ch > '\u007f') {
        StringBuilder sb = new StringBuilder();
        // write \udddd
        sb.append("\\u");
        StringBuffer hex = new StringBuffer(Integer.toHexString(ch));
        hex.reverse();
        int length = 4 - hex.length();
        for (int j = 0; j < length; j++) {
            hex.append('0');
        }
        for (int j = 0; j < 4; j++) {
            sb.append(hex.charAt(3 - j));
        }
        return sb.toString();
    } else {
        return Character.toString(ch);
    }
}
...