string - 如何从 Racket 中的字符串中删除重音?

标签 string scheme lisp racket

我有一个像café 这样的字符串,我需要将它翻译成cafe。 我试过 (string-normalize-nfd "café") 但它返回 cafe 一个带重音的引号,和 `(string-normalize-nfd alguém) 返回重音为 malguem。 如何将重音字符串转换为非重音字符串?

最佳答案

我想不出一个内置过程可以满足您的需求,但是编写您自己的实现很容易:

; maps accented chars to unaccented chars
(define translate
  '#hash((#\á . #\a)
         (#\é . #\e)
         (#\í . #\i)
         (#\ó . #\o)
         (#\ú . #\u)))

(define (remove-accents str)
  (apply string ; convert char list back into string
         ; for each char: replace it with non-accented
         ; version, if not present leave it unmodified
         (map (λ (c) (hash-ref translate c (const c)))
              (string->list str)))) ; convert string to char list

请确保根据需要添加更多映射,例如包含大写字符等。它按预期工作:

(remove-accents "café")
=> "cafe"

关于string - 如何从 Racket 中的字符串中删除重音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51633087/

相关文章:

python - 如何添加/替换/删除字符串中的转义字符 - Python

c# - 如何在某个字符最后一次出现后删除所有文本

scheme - 这些嵌套向量是如何连接的?

haskell - 更新后IORef仍然引用旧值

scheme - 在方案中使用嵌套的 let 或 let*

emacs - Emacs 上的 SLIME 和 repl 中的 paredit - 如何防止执行不完整但平衡的表达式?

lisp - 允许将特殊形式视为正常值会产生什么后果?

c# - 如何迭代数组/集合/列表中的 "between"项?

java - 如何在 Java 中格式化字符串

functional-programming - 不使用中间列表过滤范围