2014-03-24 28 views
3

我需要在OCaml中大写一些文本(即将第一个字母大写)。不幸的是我的文本是UTF-8,标准库只支持ASCII。大写UTF-8文本

我在电池中发现了uppercase功能,但它似乎只在旧版本中可用。 Camomile(看起来像处理UTF-8的最佳选择)似乎已经死了,文档很少。

+1

甘菊是我一直使用的想象。基于刚刚进行的一些快速检查,它似乎是一个相当活跃的项目(在上个月从OPAM下载776次),在过去几个月内进行了修改。但看起来很难访问文档。在下面几个链接之后,我最终看到了Github上文档的HTML源代码。尽管如此,还是有文档和甘菊可能是我个人使用的。 –

+0

要考虑的另一件事是如何大写取决于区域设置。例如http://en.wikipedia.org/wiki/Dotted_and_dotless_I – user102008

回答

3

甘菊是这里的解决方案。文档位于sourceforge:http://camomile.sourceforge.net/dochtml/index.html 它非常有趣,可能一见钟情,可能需要一些时间来掌握它,但它的确能完成这项工作。

大写将是这样的:

# open CamomileLibraryDefault;; 
# module CM = Camomile.CaseMap.Make(Camomile.UTF8);; 
# print_endline (CM.titlecase "привет");; 
Привет 
+0

谢谢,不幸的是,titlecase并没有大写,它将每个单词都用上了,而不仅仅是第一个单词。 – Thomash

3

由于ygrek的帮助下,我已经找到了答案,我的问题:

let capitalize (s : string) : string = 
    if s = "" then "" else 
    let open CamomileLibraryDefault.Camomile in 
    let module CM = CaseMap.Make(UTF8) in 
    let first = UTF8.get s 0 in 
    let capital = CM.uppercase (UTF8.init 1 (fun _ -> first)) in 
    UTF8.init (UTF8.length s) (function 0 -> UTF8.get capital 0 | i -> UTF8.get s i) 
+0

由于性能的原因,最好在函数之外创建模块CM – ygrek