String 如何去除球拍中琴弦的重音?

String 如何去除球拍中琴弦的重音?,string,scheme,lisp,racket,String,Scheme,Lisp,Racket,我有一个字符串,比如café,我需要将它翻译成cafe。 我尝试了(string normalize nfd“café”),但它返回带有重音的引号caf,并且`(string normalize nfdalgueém)返回带有重音的alguem。 如何将重音字符串转换为非重音字符串?我想不出一个可以满足您需要的内置过程,但编写自己的实现很容易: ; maps accented chars to unaccented chars (define translate '#hash((#\á .

我有一个字符串,比如café,我需要将它翻译成cafe。 我尝试了
(string normalize nfd“café”)
,但它返回带有重音的引号caf,并且`(string normalize nfdalgueém)返回带有重音的alguem
如何将重音字符串转换为非重音字符串?

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

; 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"

你的问题不是关于球拍的;这是关于Unicode规范化的。您所引用的函数执行上描述的“规范化” .


在我看来,如果您知道原始字符串不包含重音字符,那么最好的方法可能是执行规范化,然后去掉任何重音字符。

您有正确的想法使用
字符串规范化nfd
——它实际上正在工作!只是球拍弦是UTF-8,打印合成或分解的都是UTF-8

(string-normalize-nfd "café") ;Racket prints UTF-8 string as "café"
如果将字符串转换为字节,您可以看到它是有效的:

(string->bytes/utf-8 (string-normalize-nfd "café")) ;#"cafe\314\201"
鉴于此,这里是一个函数的粗略切割。如果这个 在所有情况下都完全正确。但希望这足够让你 你在路上,你可以完善它

(define (ascii-ize s)
  (list->string
   (for/list ([b (in-bytes (string->bytes/utf-8
                            (string-normalize-nfd s)))]
              #:when (< b 128))
     (integer->char b))))

(ascii-ize "café")   ;"cafe"
(ascii-ize "alguém") ;"alguem"
(定义(ascii码)
(列表->字符串)
(对于/list([b(字节)(字符串->字节/utf-8
(字符串规范化nfd(s)))]
#:当(字符b)))
(a)“咖啡馆”);“咖啡馆”
(a)“阿尔盖姆”);“阿尔盖姆”

球拍功能执行该页所述操作。您可以使用iconv