【问题标题】:Eclipse IDE processing emojis using surrogate pairsEclipse IDE 使用代理对处理表情符号
【发布时间】:2016-11-01 19:29:52
【问题描述】:

我无法找到明确的答案。 ECLIPSE IDE 是否支持表情符号?我在这里阅读了很多关于堆栈溢出的代理对,但我无法得到明确的答案。

我必须逐个字符地读取文本文件,并且我正在使用 FileInputStream。

是否可以使用代理对来处理表情符号?我想使用一些精选的苹果表情符号。这些具体:???? ??? ?????? 通过处理它们,我的意思是我想在读取文件时将它们识别为特定的表情符号。

如果是这样,有人可以给我举个例子吗?

【问题讨论】:

  • 简短回答:是的,有可能。 “处理表情符号”是什么意思?你想用它们做什么?
  • 通过处理它们,我的意思是我希望能够单独识别它们并根据它是哪个表情符号返回一些东西。

标签: java eclipse surrogate-pairs


【解决方案1】:

InputStreams 用于读取字节; Readers 用于读取字符。所以你应该使用从 Files.newBufferedReader 获得的 Reader,或者使用 FileReader 或 InputStreamReader。

尽管 Java 在 String 中使用代理对来表示表情符号和许多其他类型的 Unicode 字符,但您不需要直接处理代理对。仅存在代理值是因为许多字符值对于 Java char 类型来说太大了。如果您将单个字符读取为int 值(例如,使用CharSequence.codePoints 方法),您每次都会获得整个字符值,并且您永远不会看到或必须处理代理值。

在撰写本文时,Unicode 将表情符号定义为位于 Emoticons 块中、Supplemental Symbols and Pictographs 块中的一部分以及 Miscellaneous Symbols 块中的三个旧字符。

因此,使用 BufferedReader 并使用整数遍历字符数据可能如下所示:

try (BufferedReader reader =
    Files.newBufferedReader(Paths.get(filename), Charset.defaultCharset())) {

    IntStream chars = reader.lines().flatMapToInt(String::codePoints);
    chars.forEachOrdered(c -> {
        if ((c >= 0x2639 && c <= 0x263b) ||
            (c >= 0x1f600 && c < 0x1f650) ||
            (c >= 0x1f910 && c < 0x1f930)) {

            processEmoji(c);
        }
    });
}

【讨论】:

  • 非常感谢,这帮助很大。感谢您的详细回复。我感觉我没有使用正确的文件阅读器。
猜你喜欢
  • 2018-10-02
  • 2016-10-05
  • 2020-03-15
  • 1970-01-01
  • 2019-01-27
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多