Character encoding 为什么不是';t dchar是D中的标准字符类型吗?

Character encoding 为什么不是';t dchar是D中的标准字符类型吗?,character-encoding,character,d,Character Encoding,Character,D,只要浏览digitalmars.D.learn论坛,以及与StackOverflow相关的D问题,在我看来,初学者D程序员(包括我在内)的一个主要错误点是char、wchar、dchar和相关字符串类型的用法和能力的差异。这会导致以下问题: 我知道它必须是向后兼容性的原因和对来自C++或C的开发人员的熟悉度。但我认为可以提出一个相当有说服力的论点,即这些开发人员在尝试使用字符或字符串进行非平凡操作时遇到的问题抵消了这一可能的收益,并期望它能像在C/C++中一样工作,结果以难以调试的方式

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

我知道它必须是向后兼容性的原因和对来自C++或C的开发人员的熟悉度。但我认为可以提出一个相当有说服力的论点,即这些开发人员在尝试使用字符字符串进行非平凡操作时遇到的问题抵消了这一可能的收益,并期望它能像在C/C++中一样工作,结果以难以调试的方式失败


为了避免这些问题,我看到D开发社区有经验的成员一次又一次地告诉没有经验的程序员使用dchar来避免这些问题,这就引出了一个问题,为什么char在默认情况下不是32位unicode字符,由于8位ASCII字符被降级为achar或类似的字符,只有在必要时才可以触摸?

我个人希望
char
不存在,而不是
char
wchar
dchar
,我们有了更像
utf8
utf16
,和
utf32
。然后,每个人都会立即意识到
char
不应该用于单个字符,但事实并非如此。我要说的是,几乎可以肯定的是,
char
只是从C/C++中提取出来的,然后添加了其他字符以改进Unicode支持。毕竟,
char
并没有什么根本的问题。只是很多程序员错误地理解了
char
总是一个字符(即使在C/C++中也不一定是这样)。但是Walter Bright对Unicode有很好的理解,并且似乎认为其他人也应该这样做,所以他倾向于在Unicode方面做出决定,如果你理解Unicode,那么Unicode工作得非常好,但是如果你不理解(大多数程序员都不理解),那么Unicode工作得就不太好。D几乎迫使您至少对Unicode有一个基本的了解,这并不全是坏事,但它确实会让一些人绊倒

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

在D中管理字符串的方式通常工作得非常好。只是名称
char
对许多人来说含义不正确,而且在许多情况下,语言不幸地选择字符文本默认为
char
,而不是
dchar

我认为可以提出一个相当有说服力的论点,即这些开发人员在尝试使用字符或字符串的非平凡事物时遇到的问题抵消了这一可能的收益,并期望它像在C/C++中一样工作,但却以难以调试的方式失败

事实上,C/C++中的字符串与D中的字符串工作方式相同,只是它们不能保护您免受无知或愚蠢的伤害,不像D中的字符串。C/C++中的字符总是8位,通常被操作系统视为UTF-8代码单元(至少在*nix-land中,Windows对
char
的编码做了一些奇怪的事情,通常要求您对Unicode使用
wchar\t
)。当然,C/C++中的任何Unicode字符串都是UTF-8,除非您显式使用使用不同编码的字符串类型。
std::string
和C字符串都在代码单元而不是代码点上运行。但一般C/C++程序员将其视为每个元素都是一个完整的字符,这很简单错,除非你只使用ASCII,在这个时代,这通常是一个非常糟糕的假设


D采取了在该语言及其标准库中实际构建适当的Unicode支持的路线。这迫使您至少对Unicode有一个基本的了解,并且通常使其更难出错,同时为理解Unicode的人提供了非常强大的工具,不仅可以正确而且高效地管理Unicode字符串tly.C/C++只是回避了这个问题,让程序员踩上了Unicode地雷。

我把这个问题理解为“为什么默认情况下字符串中不使用dchar?”

dchar是一个UTF-32代码单元。你很少想处理UTF-32代码单元,因为你浪费了太多的空间,特别是如果你只处理ASCII字符串

使用UTF-8代码单元(D中适当的类型是char)更节省空间

D字符串是一个
不可变(char)[
,即UTF-8代码单元的数组


是的,如果您经常对字符串进行随机访问,处理UTF-32代码单元可能会提高应用程序的速度。但是如果您知道要对某些特定文本进行随机访问,那么在这种情况下,请使用
dstring
类型。这就是说,您现在应该理解为什么D将字符串视为dchar范围。

组合字符,即使是
dchar
也不能真正容纳所有的Unicode字符(以任何人类愿意想到的方式),也不能直接索引(例如,请参见末尾)。

实际上,您可以在D中出错,但只有将其破解到submission@ratchet怪胎