Использование потоков для манипулирования строкой с известными индексами

Для текущего проекта программирования, который я делаю, мне нужна возможность преобразовывать слова, содержащие умлауты, отличные от ASCII, такие как «ä», «ö» или «ü», в слова/строки, содержащие Unicode (\u00F6).

Чтобы достичь этого, я хотел попробовать «новые» потоки Java. До сих пор мне удавалось получить все индексы символов, которые не помещались в кодировку ASCII по умолчанию и поэтому нуждались в замене.

public static void replaceUmlauts() {
  char[] chars = "persönlich".toCharArray();
  int[] ind = IntStream.range(0, chars.length).filter(i -> chars[i] > 128).toArray();
}

Тем не менее, я не нахожу способа красиво заменить умляуты в указанных индексах их соответствующими представлениями Unicode. Чтобы остаться с одной парадигмой, я хотел бы найти решение Stream, но я также был бы открыт для других эффективных решений для решения проблемы.

Также будут высоко оценены совершенно разные - может быть, даже более простые подходы - ко всем проблемам.


person Marco N.    schedule 12.08.2016    source источник
comment
Символы Java уже находятся в Unicode. Что именно ты пытаешься сделать?   -  person 4castle    schedule 12.08.2016
comment
Ну, я хочу хранить строки Java в файле {somename}.properties. Поскольку у меня возникли некоторые проблемы с кодировкой (CP1252 для компьютеров с Windows и UTF-8 для других систем), я хотел бы сохранить такие строки, как persönlich как pers\u00F6lich, чтобы избежать проблем в дальнейшем. Таким образом, пока работа с persönlich и подобными словами прекрасно работает «внутри Java», я твердо верю, что для сохраняемости явное преобразование действительно полезно.   -  person Marco N.    schedule 12.08.2016
comment
@МаркоН. Прежде чем что-либо делать, прочтите это. Не пытайтесь быть умным, иначе вы можете оказаться в ситуации, подобной он.   -  person Kayaman    schedule 12.08.2016
comment
Вместо того, чтобы использовать потоки, вы должны использовать решения в вопросе, который я связал. Кажется, ни один из ответов не содержит решений, которые являются кандидатами на поток.   -  person 4castle    schedule 12.08.2016
comment
@Kayaman: Спасибо за ссылку. Я читаю это прямо сейчас. И я должен признать, что уже беспокоился о том, что этот подход может быть несколько нарушен - я думаю, я просто стал параноиком из-за некоторых очень трудоемких проблем, с которыми я столкнулся в последнее время.   -  person Marco N.    schedule 12.08.2016
comment
И @4castle: Спасибо! Приятно осознавать, что на самом деле мне даже не нужно об этом заботиться. Поэтому я написал начальные файлы вручную и, наверное, просто пропустил этот факт. Это сэкономит мне довольно много времени.   -  person Marco N.    schedule 12.08.2016
comment
@MarcoN.: Здесь я понял, что решение только для потока: String str = raw.chars().mapToObj(c -> (String)(c > 128 ? String.format("\\u%04x", (int) c) : String.valueOf((char)c))).collect(Collectors.joining());   -  person Andreas Brunnet    schedule 12.08.2016


Ответы (1)


простым решением было бы

    String in = "persönlich";
    StringBuilder out = new StringBuilder();
    for (int i = 0; i < in.length(); i++) {
        char ch = in.charAt(i);
        out.append(ch <= 127 ? ch : "\\u" + String.format("%04x", (int)ch));
    }

Или, если вы хотите сделать это "потоковым":

    String text = "persönlich";
    StringBuilder result = new StringBuilder();
    text.chars().forEachOrdered(c -> result.append(c < 128 ? (char) c : String.format("\\u%04X", c)));
    System.out.println(result);
person Guenther    schedule 12.08.2016