Как получить кодированную версию строки (например, \ u0421 \ u0436 \ u0436 \ u0431 \ u043d \ u0430 \ u044f) - PullRequest
1 голос
/ 04 августа 2011

Как получить закодированную версию строки (например, \ u0421 \ u043b \ u0436 \ u0435 \ u043d \ u0430 \ u044f) с использованием Java?

РЕДАКТИРОВАТЬ: я думаю, вопрос не очень ясен... В основном я хочу вот что:

Заданная строка s = "blalbla" Я хочу получить строку "\ uXXX \ uYYYY"

Ответы [ 5 ]

2 голосов
/ 04 августа 2011

Вам нужно будет извлечь каждую кодовую точку / единицу из строки и кодировать ее самостоятельно.Следующее работает для всех строк, даже если отдельные лингвистические символы в строке состоят из орграфов или лигатур.

public String getUnicodeEscapes(String aString)
{
    if (aString != null && aString.length() > 0)
    {
        int length = aString.length();
        StringBuilder buffer = new StringBuilder(length);
        for (int ctr = 0; ctr < length; ctr++)
        {
            char codeUnit = aString.charAt(ctr);
            String hexString = Integer.toHexString(codeUnit);
            String padAmount = "0000".substring(hexString.length());
            buffer.append("\\u");
            buffer.append(padAmount);
            buffer.append(hexString);
        }
        return buffer.toString();
    }
    else
    {
        return null;
    }
}

Приведенный выше вывод выводится в соответствии со спецификацией языка Java для Unicode escapes , то есть он производит вывод вида \uxxxx для каждой кодовой единицы UTF-16 .Он обращается к дополнительным символам путем создания пары кодовых единиц, представленных как \uxxxx\uyyyy.

Первоначально опубликованный код был изменен для получения кодовых точек Unicode в формате U+FFFFF:

public String getUnicodeCodepoints(String aString)
{
    if (aString != null && aString.length() > 0)
    {
        int length = aString.length();
        StringBuilder buffer = new StringBuilder(length);
        for (int ctr = 0; ctr < length; ctr++)
        {
            char ch = aString.charAt(ctr);
            if (Character.isLowSurrogate(ch))
            {
                continue;
            }
            else
            {
                int codePoint = aString.codePointAt(ctr);
                String hexString = Integer.toHexString(codePoint);
                String zeroPad = Character.isHighSurrogate(ch) ? "00000" : "0000";
                String padAmount = zeroPad.substring(hexString.length());
                buffer.append(" U+");
                buffer.append(padAmount);
                buffer.append(hexString);
            }
        }
        return buffer.toString();
    }
    else
    {
        return null;
    }
}

Gruntwork выполняется методом String.codePointAt () , который возвращает кодовую точку Unicode с определенным индексом.Для экземпляра String, состоящего из комбинационных символов, длина экземпляра String будет не длиной числа видимых символов, а количеством фактических кодовых точек Unicode.Например, и объединяются в форму क् в Деванагари, и вышеуказанная функция по праву вернет U+0915 U+094d без суеты, так как String.length() вернет 2 для объединенного символа.Строки с дополнительными символами будут с отдельными кодовыми точками для отдельных символов - ?????????? (страница не будет правильно отображать этот строковый литерал, но вы можете скопировать его просто отлично; он должен быть Javascript, но записан с использованием дополнительного набора символов для Математические буквенно-цифровые символы ) вернут U+1d4a5 U+1d4b6 U+1d4cb U+1d4b6 U+1d4c8 U+1d4b8 U+1d4c7 U+1d4be U+1d4c5 U+1d4c9.

1 голос
/ 04 августа 2011

Мне неизвестно о встроенном решении, поэтому:

StringBuilder builder = new StringBuilder();
for(int i=0; i<yourString.length(); i++) {
    builder.append(String.format("\\u%04x", yourString.charAt(i)));
}
String encoded = builder.toString();

Редактировать: sry, я думал, что вы хотите получить строку, закодированную в выражения \ uXXXX ...

1 голос
/ 04 августа 2011
public static void main(String[] args) {
    Charset charset = Charset.forName("UTF-8");
    CharsetDecoder decoder = charset.newDecoder();
    CharsetEncoder encoder = charset.newEncoder();

    try {
      ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f"));

      CharBuffer cbuf = decoder.decode(bbuf);
      String s = cbuf.toString();
      System.out.println(s);
    } catch (CharacterCodingException e) {
      e.printStackTrace();
    }
  }
0 голосов
/ 04 августа 2011
System.out.println ("\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f");

работает для меня как шарм:

Служебная
0 голосов
/ 04 августа 2011

Вы не сказали, какую кодировку вы используете, но, исходя из тега, я предполагаю, что вам нужна кодировка UTF-8. Вот как это сделать:

byte[] utf8 = 
    "\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f".getBytes("UTF-8");

Затем вы можете написать простой цикл для вывода байтов в utf8 в шестнадцатеричном или десятичном виде ... или сделать что-то еще с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...