如何解析curl返回的"\uNNNN"?

curl POST一个url,收到的返回里有中文 内容为: {“result”:"\u601d\u60f3"}

如何才能解析成期望的字符串呢? {“result”:“思想”}

|xargs echo 试一下

找到段代码,改了改能用… (unicode-unescape-string str)

(defun unicode-char (code) (decode-char 'ucs code))

(defun unicode-unescape-string (str)
  (with-temp-buffer
     (insert str)
     (unicode-unescape-region (point-min) (point-max))
     (buffer-string)
     )
  )

(defun unicode-unescape-region (start end)
  "指定した範囲のUnicodeエスケープ文字(\\uXXXX)をデコードする."
  (interactive "*r")
  (save-restriction
    (narrow-to-region start end)
    (goto-char (point-min))
    (while (re-search-forward "\\\\u\\([[:xdigit:]]\\{4\\}\\)" nil t)
      (replace-match (string (unicode-char
                              (string-to-number (match-string 1) 16)))
                     nil t))))

来源: http://lisperblog.blogspot.com/2010/09/emacsunicode.html

4 个赞

谢谢!这个service不返回utf-8真是伤心,加了request head也不返回

应该用不着解析。Emacs Lisp 字符串正好支持这种写法:

"\u601d\u60f3"
;; => "思想"
2 个赞

学到了,如果要编码成这种写法该怎么做呢?

这个编码是json标准定义的,如果支持utf8编码的字符串处理库,不需要额外的处理

这个字符串,写成elisp的string的话,是这样的: "\\u601d\\u60f3"

哦,刚刚也想到会这样,这样可以二次经过 Elisp Reader:

(read (concat "\"" "\\u601d\\u60f3" "\""))
;; => "思想"

这种方法不见得就比你自己找的方法好,用你自己觉得好的方法。

3 个赞

真的NICE!!!!

正则太多转义字符了,看得心累

直接用 (rx ...)会好点

(rxt-elisp-to-rx "\\\\u\\([[:xdigit:]]\\{4\\}\\)")
;; (seq "\\u"
;;      (submatch
;;       (= 4 xdigit)))

(equal "\\\\u\\([[:xdigit:]]\\{4\\}\\)"
       (rx (seq "\\u" (submatch (= 4 xdigit)))))
;; t