在启用了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应用程序,但看起来我会查找并输入表情符号代码?或者我错过了一些明显的东西?
答案 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"
简短,但也许不是最负责任的选择。