如何在OCaml中正确遍历UTF-8字符串?

如何在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")` 虽然,由于它被称为“不安全”(医生没有说明

假设我有一些输入词,比如“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")`
虽然,由于它被称为“不安全”(医生没有说明原因),可能这是等效的:

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
,因此,不需要转换:a
BatUTF8.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…)。