2016-08-12 6 views
4

Для текущего проекта программирования, который я делаю, мне нужна возможность конвертировать слова, содержащие не-ASCII umlauts, такие как «ä», «ö» или «ü» в слова/строки, содержащие 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, но я также был бы открыт для других эффективных решений для решения проблемы.

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

+0

Java символы уже в Unicode. Что именно ты пытаешься сделать? – 4castle

+0

Ну, я хочу, чтобы хранить строки Java в '{somename} .properties' файле. Поскольку у меня возникли некоторые проблемы с кодированием (CP1252 для машин Windows и UTF-8 для других систем), я бы хотел сохранить Strings как 'persönlich' как' pers \ u00F6lich', чтобы избежать каких-либо проблем позже. Поэтому, работая с 'persönlich' и аналогичными словами, прекрасно работает в Java, пока я твердо убежден в том, что для persistent явное преобразование полезно. –

+1

@MarcoN. Прежде чем что-либо предпринять, прочитайте [this] (http://www.joelonsoftware.com/articles/Unicode.html). Не пытайтесь быть умным, или вы можете оказаться в такой ситуации, как [его] (http://stackoverflow.com/questions/38890321/recover-wrongly-encoded-character-java/38890501). – Kayaman

ответ

0

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

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

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

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