D中原始字符类型的限制是什么?

Ian*_*ham 13 unicode d utf-8 utf primitive-types

我目前正在探索Digital Mars D语言的规范,并且在理解原始字符类型的完整性方面遇到了一些麻烦." 学习探戈与D "一书对该领域语言的能力和局限性同样含糊不清.

这些类型在网站上给出:

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支持的任何语言?

我非常感谢您提供有关这些类型如何在幕后工作的任何具体信息,以及有关处理其限制的任何一般最佳实践建议.

Vla*_*eev 15

单个charwchar代表UTF 代码单元.这意味着,通过它自己,charin可以表示ASCII符号(0-127)或者是表示Unicode字符(代码点)的UTF-8序列的一部分.只有dchar类型可以表示整个Unicode字符,因为Unicode中有超过65536个代码点.

铸造一个型串类型(string,wstringdstring,它们是简单的字符类型的动态数组)将不会它们的内容自动转换到相应的UTF表示.为了做到这一点,你必须使用功能toUTF8,toUTF16toUTF32std.utf(或toString/ toString16/ toString32tango.text.convert.Utf,如果你使用的探戈).

用户已经实现了字符串类,这些字符串类将自动使用可以将每个字符映射到单个代码单元的最具内存效率的表示.这允许以最小的内存开销快速切片和索引.一个这样的实现多行文字由克里斯托弗·米勒E..

进一步阅读:

  • 看来,我的问题在于理解代码单元和代码点之间的区别.最后一个链接很好地解释了一切.谢谢. (2认同)