【问题标题】:Clojure: Escaping unicode `\U` in JSON encodingClojure:在 JSON 编码中转义 unicode `\U`
【发布时间】:2017-06-09 12:56:59
【问题描述】:

给未来读者的后记

  • Elm 允许在字符串中使用文字 C:\Users\myuser
  • 这与 JSON 规范一致
  • 我的问题与此无关,但几层转义使问题复杂化。未来的教训:完全生成一个最小的工作示例会发现错误!

原始问题

我有一个与 Elm 前端对话的 Clojure 后端。在 Elm 中解码 JSON 值时遇到了问题。

\U 下面表示文字字符反斜杠和 U,就像从文本文件中读取一样。 "\\U" 与 Clojure 和 Elm 源中的输入相同(\ 必须转义)。附注""

问题:编码\U

Elm 字符串解码器不接受转义的 "\\U" 文字字符串 \U

A blog post 建议要获取文字字符串\U,这应该在源代码中编码为"\\\\U",“escaping the unicode escape”。

我要发送给客户端的文字字符串是C:\Users\myuser。我更喜欢将有效的 JSON 从服务器发送到客户端。

Clojure 标准库行为

clojure.data.json 不会对包含文字 \U 的字符串做任何特殊处理。下面的示例显示\U\m 受到同等威胁,反斜杠被转义,后面的字符被忽略。

project.core> (clojure.data.json/write-str "C:\\Users\\myuser")
"\"C:\\\\Users\\\\myuser\""

手动解决方法

临时解决方法是手动转义我需要的字符串:

(defn escape-backslash-u [s]
  (clojure.string/replace s "\\U" "\\\\U"))

具体问题

  • clojure.data.json/write-str 的行为是否正确?据我了解文档,输出应该是有效的 unicode。
  • 其他 JSON 库的行为是否类似?
  • Elm 的 Json.Decode 是否通过拒绝文字字符串 \U 而表现正确?

解决进度

【问题讨论】:

    标签: json unicode clojure elm


    【解决方案1】:

    我想你可能在这里走错路了。

    您作为示例给出的字符串"C:\\Users\\myuser" 完全没有问题,它不包含任何Unicode 转义序列。它是一个包含 ASCII 字符“C”、“:”、“\”、“U”等的字符串。反斜杠是 Clojure 字符串中的转义字符,因此需要对其自身进行转义以表示文字反斜杠。

    在任何情况下,字符串"C:\\Users\\myuser" 都可以用(clojure.data.json/write-str "C:\\Users\\myuser") 进行序列化,并且,如您所知,这会得到"\"C:\\\\Users\\\\myuser\""。所有这些看起来都非常简单明了。

    打印"\"C:\\\\Users\\\\myuser\"" 会导致打印原始字符串"C:\\Users\\myuser"。该字符串被JSONLint 接受为有效,再次符合预期。

    【讨论】:

    • 我创建了一个minimal example 来产生我认为正在发生的事情,但我无法重现我认为错误的事情。我认为我的测试数据有误。谢谢!
    • 更新:发现错误,在其他地方。再次感谢。
    【解决方案2】:

    我将其理解为Elm 无法将\"C:\\\\User... 解码为"C:\\User...,因为它将\u 解释为转义序列的开始。

    我用以下代码尝试了 elm here

    import Html exposing (text)
    
    main =
      text "\"c:\\\\user\\\\foo\"" // from clojure.data.json/write-str
    

    依次编译/运行到

    "c:\\user\\foo"
    

    我觉得不错。

    您确定没有其他事情发生(中间件、传输)吗?

    【讨论】:

    • "我理解为 Elm 无法将 \"C:\\\\User... 解码为 "C:\\User... 因为它将 \u 解释为转义的开始顺序。” - 是的,这就是我的想法。我的问题不在于正常的 Elm 字符串处理,如您的示例所示,而是您用于构建 JSON 解析器的JSON string decoder。我会尝试做一个最小的例子。
    • 我创建了一个minimal example 来产生我认为正在发生的事情,但我无法重现我认为错误的事情。我认为我的测试数据有误。谢谢!
    • 更新:发现错误,在其他地方。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2021-12-26
    相关资源
    最近更新 更多