【问题标题】:Using Emoji literals in Clojure source在 Clojure 源代码中使用 Emoji 文字
【发布时间】:2014-05-28 04:41:14
【问题描述】:

在启用了 UTF-8 的控制台的 Linux 上:

Clojure 1.6.0
user=> (def c \の)
#'user/c
user=> (str c)
"の"
user=> (def c \????)

RuntimeException Unsupported character: \????  clojure.lang.Util.runtimeException (Util.java:221)
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)

我希望不费吹灰之力就能拥有一个富含表情符号的 Clojure 应用程序,但似乎我会查找并输入表情符号代码?还是我在这里遗漏了一些明显的东西? ????

【问题讨论】:

标签: unicode clojure emoji


【解决方案1】:

感谢 Clojure 的 extensible reader tags,您可以自己轻松创建 Unicode 文字。

我们已经知道并非所有的 Unicode 都可以表示为 char 字面量; JVM 上 Unicode 字符的首选表示是int;并且字符串文字可以以一种便于人类阅读的方式保存任何 Unicode 字符。

因此,读作 int 的标记文字 #u "?" 将成为出色的 Unicode 字符文字!

*data-readers*中的新标记文字设置阅读器功能:

(defn read-codepoint
  [^String s]
  {:pre [(= 1 (.codePointCount s 0 (.length s)))]}
  (.codePointAt s 0))

(set! *data-readers* (assoc *data-readers* 'u #'read-codepoint))

有了这些,读者就可以读取诸如代码点整数之类的文字:

#u"?"  ; => 127826
(Character/getName #u"?")  ; => "CHERRIES"

“没有命名空间限定符的阅读器标签是为 Clojure 保留的”,文档说……#u 很短,但可能不是最负责任的选择。

【讨论】:

    【解决方案2】:

    Java 以 UTF-16 表示 Unicode 字符。表情符号字符是“补充字符”,并且有一个不能用 16 位表示的代码点。

    http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html

    本质上,补充字符不是用字符表示,而是用整数表示,并且有特殊的api来处理它们。

    一种方法是使用(Character/toChars 128516) - 这会返回一个字符数组,您可以将其转换为要打印的字符串:(apply str (Character/toChars 128516))。或者,您可以直接使用 (String. (int-array [128516]) 0 1) 从代码点整数数组创建字符串。取决于 Java/Clojure 和您的眼球之间的所有不同事物,这可能会或可能不会做您想要的。

    格式 api 支持补充字符,所以这可能是最简单的,但是它需要一个 int,所以你需要一个演员:(format "Smile! %c" (int 128516))

    【讨论】:

    • 请注意,自 2000 年代初以来 UTF-16 就不是 16 位宽 - 这是一个常见的误解。它是 16 位或 32 位宽,具体取决于所表示的代码点。虽然 Java 确实在内部使用 UTF-16,但它从 v1.5 开始支持两种位宽(比 Clojure 目前支持的最古老的 JVM 还早)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多