如何在OCaml中正确迭代UTF-8字符串?

时间:2014-10-08 20:23:50

标签: utf-8 ocaml

假设我有一些输入词,例如“føøbær”,我想要一个字母频率为s.t的哈希表。 f→1,ø→2 - 我如何在OCaml中执行此操作?

http://pleac.sourceforge.net/pleac_ocaml/strings.html示例仅适用于ASCII,https://ocaml-batteries-team.github.io/batteries-included/hdoc2/BatUTF8.html没有说明如何从字符串中实际创建BatUTF8.t。

2 个答案:

答案 0 :(得分:2)

您引用的BatUTF8模块将其类型t定义为string,因此无需转换:BatUTF8.t a string。显然,该模块鼓励您在使用其他功能之前validate string let s = "føøbær" let () = BatUTF8.validate s let () = BatUTF8.iter add_to_table s 。我想一个正确的操作方式是:

{{1}}

答案 1 :(得分:1)

看一下电池的代码,我发现了of_string_unsafe,所以也许就是这样:

open Batteries
BatUTF8.iter (fun c -> …Hashtbl.add table c …) (BatUTF8.of_string_unsafe "føøbær")`
但是,因为它被称为“不安全的”#34; (文件不要说明原因),也许这是等价的:

BatUTF8.iter (fun c -> …Hashtbl.add table c …) "føøbær"

至少它适用于此处的示例单词。

Camomile似乎也正确地遍历它:

module C = CamomileLibraryDefault.Camomile
C.iter (fun c -> …Hashtbl.add table c …) "føøbær"

我不知道Camomile和BatUTF8之间的权衡,尽管它们最终会存储不同的类型(BatUChar vs C.Pervasives.UChar)。