【发布时间】: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而表现正确?
解决进度
- 一位友好的 Clojurians Slack 用户指出了 JSON 标准规范,特别是 7. Strings 和 8.2. Unicode characters 部分。
【问题讨论】: