【问题标题】:getting exactly equal clojure/clojurescript strings in UTF-8在 UTF-8 中获得完全相同的 clojure/clojurescript 字符串
【发布时间】:2013-10-14 06:18:29
【问题描述】:

我有一个 clj 文件:

;; stringparity.clj ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(ns stringparity)

    (defn get-java-string [input]
      (.getBytes input "UTF-8"))

还有一个 cljs 文件:

;;; stringparity.cljs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(ns stringparity
  (:import goog.crypt))    

    (defn get-js-string [input]
      (goog.crypt.stringToUtf8ByteArray input))

以下代码不可执行,get-js-string 仅适用于 javascript,get-java-string 适用于 java;我只是假装你可以在同一台机器上运行它们来说明出了什么问题。这两个函数在使用“简单”字符串时都能正常工作,但在使用像"????" 这样的“复杂”字符串时会失败。我希望能够对 clojure 或 clojurescript 上的任何字符串进行哈希处理,并使它们的哈希值相同。为此,我需要能够将 javascript 或 java 字符串转换为其等效的字节数组。看来我在 clojure 和 clojurescript 方面都使用 UTF-8,但它们不会生成相同的字节数组(它们甚至不是相同的长度)。如何为 clojure 和 clojurescript 中的任何两个等效字符串生成完全相同的字节数组。

(= (seq (get-js-string "hello"))  [104, 101, 108, 108, 111]
   (seq (get-java-string "hello") [104, 101, 108, 108, 111]))


(= (seq (get-js-string "????"))
   ;; when in cljs, get-js-string evaluates to the following
   [237 160 180 237 188 134]
   (seq (get-java-string "????"))
   ;; when in clj, get-java-string evaluates to the following
   [-16 -99 -116 -122])

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    【讨论】:

    • JS impl 已经设置了链接失效。
    【解决方案2】:

    goog.crypt.stringToUtf8ByteArray 无法处理在 Javascript 字符串中表示为“代理对”的字符(例如您的“?”示例)并产生不正确的结果。

    如果您不需要 UTF-8,但只需要一个字节值序列来生成散列值,则另一种方法是在两种情况下都将字符编码为 UTF-16 字节序列:

    cljs:

    (defn to-byte [n] (if (>= n 128) (- n 256) n))
    
    (defn get-js-string [input]
      (map to-byte
        (mapcat
          #(let [u (.charCodeAt input %)]
             [(-> (bit-and u 0xFF00) (bit-shift-right 8)) (bit-and u 0xFF)]) 
          (range (.-length input)))))
    

    clj:

    (defn get-java-string [input]
      (.getBytes input "UTF-16BE"))
    

    这应该为您在这两种情况下的示例字符串提供序列(-40 52 -33 6)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多