为什么Dchar中的标准字符类型不是d?

Met*_*eta 7 d character character-encoding

只是浏览digitalmars.D.learn论坛和StackOverflow上与D相关的问题,在我看来,初学者D程序员(包括我)的一个主要错误点是char,wchar,dchar的使用和能力的差异,以及相关的字符串类型.这会导致以下问题:

我知道它必须是出于向后兼容性的原因和对来自C++或C的开发人员的熟悉程度,但我认为可以提出一个相当令人信服的论点,即当这些开发人员尝试一些非平凡的事情时,这些可能的收益会被这些问题所抵消.使用charstring并期望它在C/C++中工作,只是让它以难以调试的方式失败.

为了避免很多这些问题,我已经看到D开发社区的有经验的成员一次又一次地告诉没有经验的编码人员使用dchar来避免这样的问题,这就引出了为什么char不是32位的问题默认情况下为unicode字符,将8位ASCII字符降级为achar或类似名称,仅在必要时才触及?

Jon*_*vis 13

就个人而言,我希望char是不存在的,并且代替的char,wchar以及dchar,我们有更多的东西一样utf8,utf16utf32.然后每个人都将立即被迫认识到,char不是应该用什么单个字符,但这不是它去的方式.我要说的是,几乎可以肯定的char是,只需从C/C++中获取,然后添加其他内容以改进Unicode支持.毕竟,没有任何根本性的错误char.只是因为很多程序员都错误地理解了这一点char永远是一个角色(即使在C/C++中也不一定如此).但是Walter Bright非常了解Unicode并且似乎认为其他人也应该这样,所以他倾向于做出关于Unicode的决定,如果你理解Unicode,那么它的工作效果非常好但如果你不懂(大多数程序员没有).D几乎迫使你至少要对Unicode有一个基本的了解,这并不是一件坏事,但它确实让一些人感到沮丧.

但问题的实际情况是,尽管使用dchar单个字符很有意义,但将它用于字符串通常没有意义.有时,这就是你所需要的,但UTF-32需要的方式更多的空间比UTF-8呢.这可能会影响性能并且肯定会影响程序的内存占用.而且很多字符串处理根本不需要随机访问.因此,将UTF-8字符串作为默认值比将UTF-32字符串作为默认值更有意义.

在D中管理字符串的方式通常非常有效.只是该名称char对于许多人来说具有不正确的内涵,并且不幸的是,语言选择默认为字符文字,char而不是dchar在许多情况下.

我认为可以提出一个相当令人信服的论点,即当这些开发人员尝试使用字符串或字符串进行非常重要的事情并期望它在C/C++中工作时,这种可能的收益会被这些开发人员所遇到的问题所抵消.让它以难以调试的方式失败.

问题的实际情况是C/C++中的字符串与D中的字符串一样,只是它们不能保护你不被愚昧或愚蠢,不像char在C/C++ 中的字符串总是8位并且通常是被操作系统视为UTF-8代码单元(至少在*nix land中 - Windows为编码提供了奇怪的东西,char并且通常要求您使用wchar_tUnicode).当然,除非您明确使用使用不同编码的字符串类型,否则您在C/C++中拥有的任何Unicode字符串都是UTF-8.std::string和C字符串都在代码单元而不是代码点上运行.但是普通的C/C++程序员将它们视为每个元素都是一个完整的字符,除非你只使用ASCII,否则这是完全错误的,在这个时代,这通常是一个非常糟糕的假设.

D将实际构建正确Unicode支持的路径引入语言并进入其标准库.这迫使你至少对Unicode有一个基本的了解,并且通常会让它更难搞砸,同时让那些理解它的人非常强大,不仅能正确而且有效地管理Unicode字符串.C/C++只是解决问题的一步,让程序员踩到Unicode地雷.

  • @ratchet怪物你可以随时搞砸自己.:) (2认同)
  • 我们可以很容易地在object.d中为utf*类型引入别名. (2认同)