【问题标题】:replace escaped unicode with elisp用 elisp 替换转义的 unicode
【发布时间】:2013-10-29 06:45:20
【问题描述】:

通过在emacs中调用google dictionary api, http://www.google.com/dictionary/json?callback=cb&q=word&sl=en&tl=en&restrict=pr%%2Cde&client=te 我可以得到如下回复

"entries": [{
    "type": "example",
    "terms": [{
        "type": "text",
        "text": "his grandfather\x27s \x3cem\x3ewords\x3c/em\x3e had been meant kindly",
        "language": "en"
    }]
}]

如您所见,“文本”中有转义的 unicode。我想将它们转换成如下函数。

(defun unescape-string (string)
    "Return unescape unicode string"
    ...
)
(unescape-string "his grandfather\x27s \x3cem\x3ewords\x3c/em\x3e")
=> "his grandfathers's <em>words</em>"

(insert #x27)'
(insert #x27)'
(insert #x3c)<
(insert #x3e)>

这是我尝试过的

但是,我想我不知道如何将 '\x123' 替换为相应的 unicode 到缓冲区或字符串中。

提前致谢

【问题讨论】:

    标签: regex emacs unicode elisp


    【解决方案1】:

    似乎是最简单的方法:

    (read (princ "\"his grandfather\\x27s \\x3cem\\x3ewords\\x3c/em\\x3e had been meant kindly\""))
    ;; "his grandfather's ώm>words</em> had been meant kindly"
    

    另外有趣的是,Emacs 解析 \x3ce 而不是 \x3c。我不确定这是错误还是预期行为。我一直认为x之后不应该多读两个字符...

    如果您仍想使用read + princ 组合,则需要添加反斜杠以防止 Emacs 解析更多字符,例如:\x3c\e。或者这是我能想出的快速方法:

    (defun replace-c-escape-codes (input)
      (replace-regexp-in-string 
       "\\\\x[[:xdigit:]][[:xdigit:]]"
       (lambda (match)
         (make-string 1 (string-to-number (substring match 2) 16)))
       input))
    
    (replace-c-escape-codes "his grandfather\\x27s \\x3cem\\x3ewords\\x3c/em\\x3e")
    "his grandfather's <em>words</em>"
    

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 2023-03-11
      • 2017-02-28
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多