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

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


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


Отговори (12)


В случай, че имате нужда от това, за да напишете .properties файл, можете просто да добавите низовете в обект Properties и след това да го запишете във файл. Той ще се погрижи за преобразуването.

person x4u    schedule 03.06.2011
comment
Е, трябва да се уверите, че записвате файла във формат UTF-8 (може би UTF-16 или UCS-2/4 ще работят) или ще имате проблеми. - person Sled; 03.06.2011
comment
@ArtB: Не, Properties интерпретира входните файлове винаги като ISO-8859-1 (първа уникод страница) и също така записва в това кодиране. Ето защо се нуждае от \uXXXX екрани и ги създава при запазване. Въпреки че от версия 1.6 на Java свойствата позволяват да се чете входът от обект Reader, така че да можете да създадете свой собствен собствен формат на файла със свойства, базиран на UTF-8. - person x4u; 03.06.2011
comment
О... това не създава ли проблеми с езиците, които не са на първата страница? - person Sled; 03.06.2011
comment
Да, това води до сравнително големи файлове за езици, които използват предимно знаци извън 8859-1, защото кодирането \uXXXX е по-малко ефективно от UTF-8 или UTF-16. Освен това прави невъзможно редактирането на тези файлове във всеки редактор, който не познава това специално кодиране. Но поне позволява да се записва и зарежда целият уникод текст до степента, която се поддържа от Java VM като цяло. - person x4u; 03.06.2011
comment
@x4u Не съм сигурен, че нотацията \u ще поддържа Unicode знаци извън Unicode BMP. - person sorin; 04.06.2011
comment
Ето защо написах до разширението, което се поддържа от Java VM като цяло. Всъщност той поддържа знаци извън BMP, тъй като Java третира тези знаци като сурогатни двойки и по този начин те могат да бъдат кодирани и в двойка \u. Но нивото на поддръжка за сурогатите варира много в Java, от предимно несъществуващи до донякъде поддържани в XML-Parsers или някои компоненти на Swing. Също така много от основните процедури за манипулиране на низове в java.lang изглежда вече са запознати със сурогати (с изключение на regexp, доколкото знам), но все пак можете да изрежете низ в средата им, ако желаете. - 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
Това gist обгръща примера за команден ред по-горе в 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 commons 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
Вие го правите по обратния начин, това не е това, което OP поиска. - 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 стойността.

Cyrillic 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
@JenS. Благодаря ви, наистина, методът всъщност е 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

Има инструмент за команден ред, който се доставя с Java, наречен native2ascii. Това преобразува Unicode файлове в ASCII-екранирани файлове. Открих, че това е необходима стъпка за генериране на .properties файлове за локализация.

person Sam Barnum    schedule 03.06.2011

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

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

Има 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

person Michael Gantman    schedule 27.12.2018
comment
Тази много полезна библиотека. Това реши проблема ми с конвертирането от кирилица към unicode. Благодаря ти Майкъл. - person Zafer; 20.06.2020
comment
@Zafer Радвам се, че библиотеката ти помогна. Мога ли да те помоля за една малка услуга? бихте ли могли да стигнете до статията за моята библиотека и да оставите коментар? Ето 2 връзки: 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 - Още едно JavaScript Unicode кодиране/декодиране

person Community    schedule 03.01.2016

това име на тип е Decode/Unescape Unicode. този връзка към сайт онлайн конвертор.

person Ali Rasouli    schedule 10.06.2020