我是ocaml的新手,我想知道为什么:(命令行解释器OCaml版本4.01.0)
# open Core.Std;;
# String.lowercase "a";;
- : Core.Std.String.t = "a"
# String.lowercase("è");;
- : Core.Std.String.t = "�"
# String.lowercase "ò";;
- : Core.Std.String.t = "�"
同样的!但是使用普通字符:
# (=) "a" (String.lowercase "a");;
- : bool = true
显然:
# (=) "è" (String.lowercase "è");;
- : bool = false
有人可以解释这种行为吗?
谢谢
答案 0 :(得分:3)
这肯定是因为您的终端是UTF-8编码的,即您输入的字符串是UTF-8编码的。但是String
模块中的函数(至少在官方stdlib中)仅对latin1(ISO-8859-1)编码的字符串起作用。所以你不能指望他们使用UTF-8编码的字符串。
这应该很容易检查:
String.length "é"
如果这不是1而是2,则输入UTF-8编码的字符串。