使用流在已知索引处操作字符串

4

我正在进行一个编程项目,需要将包含非ASCII字符的单词(如'ä'、'ö'或'ü')转换为包含Unicode码(\u00F6)的单词/字符串。

为了实现这个目标,我想尝试一下“新”的Java Streams。到目前为止,我已经能够获取所有无法适应默认ASCII字符集并因此需要替换的字符的索引。

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

然而,我并没有找到一种优雅地将已确定的索引处的umlauts替换为它们各自的Unicode表示的方法。为了保持一致性,我想找到一个流式解决方案,但我也愿意接受其他有效的解决方案来解决这个问题。

如果有完全不同的、甚至更简单的方法来解决整个问题,那将非常欣赏。


Java字符已经是Unicode编码了。你具体想做什么? - 4castle
我想将Java字符串存储到{somename}.properties文件中。由于我遇到了一些编码问题(Windows机器使用CP1252,其他系统使用UTF-8),因此我希望像persönlich这样的字符串被持久化为pers\u00F6lich,以避免以后出现任何问题。虽然在Java内部处理persönlich和类似单词的工作很好,但我强烈认为对于持久性来说,显式转换实际上是有用的。 - Marco N.
1
@MarcoN. 在你做任何事情之前,请阅读这篇文章。不要试图聪明,否则你可能会陷入像那样的困境。 - Kayaman
2
你应该使用我链接的问题中提供的解决方案,而不是使用Streams。似乎没有任何答案包含适合Stream的解决方案。 - 4castle
@Kayaman:感谢你提供的链接。我正在阅读其中的内容。我必须承认,我已经担心这种方法可能有些问题 - 我猜是由于最近遇到了一些非常耗费时间的问题,让我变得过度紧张了。 - Marco N.
显示剩余2条评论
1个回答

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

或者如果你想以“流式”的方式完成:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接