在Clojure源代码中使用表情符号文字

时间:2014-05-28 04:41:15

标签: unicode clojure emoji

在启用了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应用程序,但看起来我会查找并输入表情符号代码?或者我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:8)

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

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

从本质上讲,补充字符不是作为字符而是作为整数表示,并且有特殊的apis来处理它们。

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

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

答案 1 :(得分:0)

借助Clojure的extensible reader tags,您可以自己轻松地创建Unicode文字。

我们已经知道并非所有Unicode都可以用ZERO_COPY: (in real machine) %Cpu1 : 17.8 us, 34.9 sy, 0.0 ni, 47.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 13903 squid 20 0 147236 45196 5860 R 52.2 0.1 0:15.65 squid 18.42% libc-2.17.so [.] __memcpy_ssse3_back 17.32% [kernel] [k] copy_user_generic_string 2.79% [kernel] [k] syscall_return_via_sysret 2.09% [unknown] [k] 0xfffffe800003201e 1.91% [kernel] [k] gup_pgd_range 1.21% [kernel] [k] generic_file_read_iter 1.20% [kernel] [k] _raw_spin_lock 1.05% [kernel] [k] sock_poll 1.04% [kernel] [k] sys_epoll_ctl 1.02% [kernel] [k] __schedule 0.97% [kernel] [k] __audit_syscall_entry 0.93% [kernel] [k] __zerocopy_sg_from_iter and i make a comparisonwith NO_ZEROCOPY in real machine %Cpu1 : 11.4 us, 46.8 sy, 0.0 ni, 41.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 13988 squid 20 0 115948 15228 5784 R 57.5 0.0 0:31.99 squid 33.27% [kernel] [k] copy_user_generic_string 9.62% libc-2.17.so [.] __memcpy_ssse3_back 2.34% [kernel] [k] syscall_return_via_sysret 1.80% [unknown] [k] 0xfffffe800003201e 1.35% [kernel] [k] tcp_sendmsg_locked 1.18% [kernel] [k] generic_file_read_iter NO_ZEROCOPY ZERO_COPY cpu 62.9 53.6 cpu 53.6 43.3 cpu 46.8 34.9 文字表示;在JVM上,Unicode字符的首选表示形式是char;并且字符串文字可以以人类易于阅读的方式保存任何Unicode字符。

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

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

int

在适当的位置,阅读器读取诸如代码点整数之类的文字:

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

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

“没有名称空间限定符的阅读器标签是为Clojure保留的”,文档…#u"" ; => 127826 (Character/getName #u"") ; => "CHERRIES" 简短,但也许不是最负责任的选择。