如何在OCaml中正确遍历UTF-8字符串?
假设我有一些输入词,比如“føbær”,我想要一个字母频率s.t.f的哈希表→1, ø→2–如何在OCaml中执行此操作如何在OCaml中正确遍历UTF-8字符串?,utf-8,ocaml,Utf 8,Ocaml,假设我有一些输入词,比如“føbær”,我想要一个字母频率s.t.f的哈希表→1, ø→2–如何在OCaml中执行此操作 这些示例仅适用于ASCII,并没有说明如何从字符串实际创建BAUTF8.t。查看电池代码,我发现这是不安全的,因此可能是这样的: open Batteries BatUTF8.iter (fun c -> …Hashtbl.add table c …) (BatUTF8.of_string_unsafe "føøbær")` 虽然,由于它被称为“不安全”(医生没有说明
这些示例仅适用于ASCII,并没有说明如何从字符串实际创建BAUTF8.t。查看电池代码,我发现这是不安全的
,因此可能是这样的:
open Batteries
BatUTF8.iter (fun c -> …Hashtbl.add table c …) (BatUTF8.of_string_unsafe "føøbær")`
虽然,由于它被称为“不安全”(医生没有说明原因),可能这是等效的:
BatUTF8.iter(fun c->…Hashtbl.add表c…“føbær”
至少它对这里的示例词有效
甘菊似乎也能正确地反复使用:
module C = CamomileLibraryDefault.Camomile
C.iter (fun c -> …Hashtbl.add table c …) "føøbær"
我不知道甘菊和BatUTF8之间的折衷,尽管它们最终存储了不同的类型(BatUChar与C.Pervasives.UChar)。您提到的BatUTF8
模块将其类型定义为string
,因此,不需要转换:aBatUTF8.t
就是a字符串。显然,该模块鼓励您在使用其他函数之前验证字符串。我想适当的操作方式应该是:
let s = "føøbær"
let () = BatUTF8.validate s
let () = BatUTF8.iter add_to_table s
仅为了完整性:BatUTF8.iter
为您提供了一个BatUChar
;例如,如果你想输出它们,你可以用BatUTF8.of_char c
(令人困惑的是,UChar.char\u of
将其转换为拉丁字符-1,即of_char
可能应该被称为of_UChar…)。