Преобразование международной строки в коды \u в java

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


person ehsun7b    schedule 03.06.2011    source источник


Ответы (12)


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

person x4u    schedule 03.06.2011
comment
Ну, вам нужно убедиться, что вы сохраняете файл в формате UTF-8 (возможно, UTF-16 или UCS-2/4 будут работать), иначе у вас будут проблемы. - person Sled; 03.06.2011
comment
@ArtB: Нет, свойства всегда интерпретируют входные файлы как ISO-8859-1 (первая страница юникода), а также сохраняют в этой кодировке. Вот почему ему нужны экраны \uXXXX, и он создает их при сохранении. Хотя, начиная с версии Java 1.6 Properties, позволяет читать входные данные из объекта Reader, чтобы вы могли создавать свой собственный формат файла свойств на основе UTF-8. - person x4u; 03.06.2011
comment
О... разве это не вызывает проблем с языками, отличными от первой страницы? - person Sled; 03.06.2011
comment
Да, это приводит к сравнительно большим файлам для языков, которые используют в основном символы вне 8859-1, потому что кодировка \uXXXX менее эффективна с точки зрения пространства, чем UTF-8 или UTF-16. Это также делает невозможным редактирование этих файлов в любом редакторе, который не поддерживает эту специальную кодировку. Но, по крайней мере, это позволяет сохранять и загружать весь текст в формате Unicode в той степени, в которой это поддерживается виртуальной машиной Java в целом. - person x4u; 03.06.2011
comment
@ x4u Я не уверен, что нотация \u будет поддерживать символы Unicode за пределами Unicode BMP. - person sorin; 04.06.2011
comment
Вот почему я написал до той степени, которая поддерживается виртуальной машиной Java в целом. На самом деле он поддерживает символы вне BMP, поскольку Java рассматривает эти символы как суррогатные пары, и поэтому они также могут быть закодированы в паре \u. Но уровень поддержки суррогатов сильно различается в Java: от практически полного отсутствия до некоторой поддержки в XML-парсерах или некоторых компонентах Swing. Кроме того, многие из основных подпрограмм манипуляции со строками в java.lang, похоже, уже осведомлены о суррогатах (за исключением регулярного выражения, насколько я знаю), но вы все равно можете вырезать строку в середине их, если хотите. - person x4u; 04.06.2011
comment
Это кажется действительно окольным решением. Из вопроса я предположил, что мы искали какой-то вызов метода String->String. - person Michael Haefele; 05.08.2016

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

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");

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

person Abdennour TOUMI    schedule 24.09.2013
comment
Вы можете сделать это без запуска подпроцесса, см. stackoverflow.com/a/6017769/115493 - person mik01aj; 08.12.2014
comment
Этот суть заключает приведенный выше пример командной строки в сценарий Bash, чтобы его было проще использовать. - person dvlcube; 31.07.2017
comment
Этот инструмент был удален в Java 9: ​​stackoverflow.com/questions/39400023/ - person Nicolas Raoul; 05.11.2018

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

person sorin    schedule 03.06.2011
comment
Похоже, этот метод был переименован в escapeJava в версиях 3.x - person Brad Mace; 25.06.2013
comment
и не переходит в \uXXXX - person Marc; 20.12.2013
comment
Вам лучше его не использовать;) См. ответ по адресу: stackoverflow.com/a/4298836/115493 - person mik01aj; 08.12.2014
comment
Этот метод также экранирует другие специальные символы, например. Цитировать (). Это может быть нежелательным поведением. - person hoodieman; 12.12.2016

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

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

Я сделал это, используя ресурсы Apache StringEscapeUtils. Как сказал @sorin-sbarnea. Можно загрузить здесь.

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

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

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

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

person Derzu    schedule 14.05.2012
comment
Вы делаете это наоборот, это не то, о чем просил ОП. - person mik01aj; 08.12.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, и корректно работает с низкими кодовыми точками Unicode, такими как Ä.

person mik01aj    schedule 08.12.2014
comment
работает ли он для многобайтовых символов, например. когда 4-6-8 байтов (2, 3, 4 значения java char) в строке представляют только один символ? - person radistao; 12.06.2017
comment
Это не так, потому что он повторяется с использованием одного char. - person mik01aj; 21.11.2018

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

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

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

for( char c : s.toCharArray() )

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

Кириллические символы 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)

Если он находится в этом диапазоне, это кириллица. Просто выполните проверку if. Если он находится в диапазоне, используйте 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. Я, наверное, слишком буквально прочитал ваш вопрос.

person Sled    schedule 03.06.2011
comment
Это правильный ответ в моем контексте. Однако я считаю, что getCharArray() должен быть toCharArray. - person Jen S.; 10.02.2014
comment
@ДженС. Спасибо, действительно, метод на самом деле toCharArray(). - person Sled; 10.02.2014
comment
Это неверно для всех символов Unicode! например для немецкого Ä возвращается \uC4, а не \u00c4. - person mik01aj; 08.12.2014
comment
@ m01 Я полагаю, что первоначальная форма вопроса была конкретно о русских иероглифах. - person Sled; 08.12.2014
comment
Русский язык был приведен просто для примера. Ваш пример в порядке; диапазон проверяет в if защиту от этого случая. См. также мой ответ для общего подхода. - person mik01aj; 08.12.2014
comment
Значение char является значением Unicode. Да, но более конкретно, это значение кодовой единицы UTF-16 с одной или двумя кодовыми единицами UTF-16 на кодовую точку Unicode. Кодовые единицы UTF-16 являются тем, что вам нужно для построения Экраны символов исходного кода Java (независимо от того, используются они в литеральных строках или нет). - person Tom Blodget; 09.12.2014


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

"Art of Beer ???? ????" -> "Art of Beer \u1F3A8 \u1F37A"
person davidofmorris    schedule 18.07.2016

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

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.

person Michael Gantman    schedule 27.12.2018
comment
Это очень полезная библиотека. Это решило мою проблему с преобразованием из кириллицы в юникод. Спасибо, Майкл. - person Zafer; 20.06.2020
comment
@Zafer Я рад, что библиотека помогла тебе. Могу я попросить вас о небольшой услуге? не могли бы вы перейти к статье о моей библиотеке и оставить комментарий? Вот две ссылки: linkedin. com/pulse/, community.oracle.com/blogs/michaelgantman/2016/01/26/ - person Michael Gantman; 20.06.2020

Просто некоторые основные методы для этого (вдохновленные инструментом 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);
    }
}
person larsilus    schedule 09.02.2018

Вероятно, вы могли бы взломать этот код JavaScript:

/* convert ???? to \uD83D\uDE4C */
function text_to_unicode(string) {
  'use strict';

  function is_whitespace(c) { return 9 === c || 10 === c || 13 === c || 32 === c;  }
  function left_pad(string) { return Array(4).concat(string).join('0').slice(-1 * Math.max(4, string.length)); }

  string = string.split('').map(function(c){ return "\\u" + left_pad(c.charCodeAt(0).toString(16).toUpperCase()); }).join('');

  return string;
}


/* convert \uD83D\uDE4C to ???? */
function unicode_to_text(string) {
  var  prefix = "\\\\u"
     , regex  = new RegExp(prefix + "([\da-f]{4})","ig")
     ; 

  string = string.replace(regex, function(match, backtrace1){
    return String.fromCharCode( parseInt(backtrace1, 16) )
  });

  return string;
}

источник: iCompile — еще одно кодирование/декодирование Unicode для JavaScript

person Community    schedule 03.01.2016

имя этого типа — Decode/Unescape Unicode. это ссылка на сайт онлайн-конвертер.

person Ali Rasouli    schedule 10.06.2020