我目前正在探索Digital Mars D语言的规范,并且在理解原始字符类型的完整性方面遇到了一些麻烦。关于该领域语言的能力和局限性,本书Learn to Tango With D同样含糊不清。
这些类型在the website上给出:
char; // unsinged 8 bit UTF-8 wchar; // unsigned 16 bit UTF-16 dchar; // unsigned 32 bit UTF-32
由于我们知道大多数Unicode转换(UTF)格式编码表示具有可变位宽的字符,这是否意味着D中的char只能包含适合8位的值,或者它是否扩展当你给它双字节字符时,在机器的物理内存中?也许还有其他一些可能性,比如在重载变量时自动转换为下一个最合适的类型?
比方说,我想在编辑器中使用UTF-8字符并输入中文。它会简单地摔倒,还是能够更正确地处理Unicode字符,就像在C#中一样?是否仍然需要提供胶水代码以允许使用Unicode支持的任何语言?
我很感激您可以提供有关这些类型如何在幕后工作的任何具体信息,以及有关处理其限制的任何一般最佳实践建议。
答案 0 :(得分:15)
单个char
或wchar
代表UTF code unit。这意味着,char
in可以表示ASCII符号(0-127),也可以是表示Unicode字符(code point)的UTF-8序列的一部分。只有dchar
类型可以表示整个Unicode字符,因为Unicode中有超过65536个代码点。
转换一种类型的字符串类型(string
,wstring
和dstring
(它们只是字符类型的动态数组)不会自动将其内容转换为相应的UTF表示形式。为此,您必须使用toUTF8
(或toUTF16
/ toUTF32
/ {{std.utf
/ toString
/ {{toString16
中的toString32
,tango.text.convert.Utf
和{{1}}函数如果您使用Tango,请从{{1}}开始。}
用户已经实现了字符串类,这些字符串类将自动使用可以将每个字符映射到单个代码单元的最具内存效率的表示。这允许以最小的内存开销快速切片和索引。其中一个实施是克里斯托弗·E·米勒的mtext。
进一步阅读: