【问题标题】:Why don't popular programming languages use some other character to delimit strings? [closed]为什么流行的编程语言不使用其他字符来分隔字符串? [关闭]
【发布时间】:2009-06-08 15:22:03
【问题描述】:

我知道的每种编程语言(Perl、Javascript、PHP、Python、ASP、ActionScript、Commodore Basic)使用单引号和双引号来分隔字符串

这造成了必须竭尽全力正确处理引号的持续情况,因为引号在字符串的内容中极为常见。

为什么编程语言不使用一些其他字符来分隔字符串,在正常对话中不使用的字符\, |或 { } 例如),这样我们就可以继续我们的生活了吗?

这是真的,还是我忽略了什么?有没有一种简单的方法可以在现代编程语言中停止对字符串使用引号?

打印 我知道 here document 语法,但对于较小的字符串操作,它过于复杂并且格式复杂。
结束;

[更新] 你们中的许多人都很好地说明了仅使用 ASCII 字符的重要性。我更新了示例以反映这一点(反斜杠管道大括号)。

【问题讨论】:

  • 您说程序员必须竭尽全力才能在字符串中使用引号 - 但为什么呢?我不知道任何一种编程语言都没有一个体面且非常简单的字符串引号转义机制。
  • 有很多原因——PHP 有魔术引号,有时打开有时关闭,这意味着没有经验的程序员不确定是否要转义引号。而且,在存储、打印、使用 eval() 等函数时,您必须跟踪字符串是否被转义。而且,这意味着对于不使用最佳方法的人来说,sql 注入的风险会急剧上升实践。
  • 你要敲多少次键才能得到这些字符? (¤、|、§ 或 µ)任何超过 2 的内容(IMO)都比简单地使用单引号或双引号本身的效率低。
  • 这不是大多数语言或应用程序的问题。您的 cmets 建议使用 PHP 生成 MySQL 查询和 PHP 中的“智能”引号是一个问题。大多数其他语言没有“智能”引号,并且大多数 SQL 接口都支持预准备语句。
  • 完全正确。事实上,如果你想写一个关于这个的答案,我很乐意接受它作为最好的答案。

标签: string character language-design delimiter


【解决方案1】:

Perl 允许您使用whatever characters you like

 "foo $bar" eq
 qq(foo $bar) eq
 qq[foo $bar] eq
 qq!foo $bar! eq
 qq#foo $bar# etc

Meanwhile
 'foo $bar' eq
 q(foo $bar) eq
 q[foo $bar] eq
 q!foo $bar! eq
 q#foo $bar# etc

语法扩展到其他功能,包括正则表达式,如果您正在处理 URI,这很方便。

 "http://www.example.com/foo/bar/baz/" =~ /\/foo/[^\/]+\/baz\//;
 "http://www.example.com/foo/bar/baz/" =~ m!/foo/[^/]+/baz/!;

【讨论】:

  • 谢谢,我不知道这个符号。
  • 我经常将 # 用于正则表达式,因为我经常希望在其中使用斜杠,并且我不希望它们像第二个示例中的第一行那样结束。
【解决方案2】:

当前:“打字机”“引号”标记

使用我们目前使用的引号有很多很好的理由:

  • 在键盘上很容易找到引号 - 所以它们很容易输入,而且它们必须很容易,因为经常需要字符串。

  • 引号是 ASCII 格式 - 大多数编程工具只能很好地处理 ASCII。您可以在几乎任何可以想象的环境中使用 ASCII。当您在某个遥远的服务器中通过 telnet 连接修复程序时,这一点很重要。

  • 引号有多种版本 - 单引号、双引号、反引号。因此,一种语言可以为不同引用的字符串分配不同的含义。这些不同的引号也可以解决“引号内”的问题。

  • 引号很自然 - 早在编程语言出现之前,英语就使用引号来标记文本段落。在语言学中,引号的使用方式与编程语言中的使用方式完全相同。引号是自然的,就像 + 和 - 对于加法和减法一样自然。

替代方案:“排版”“正确”引号

从技术上讲,它们是优越的。一大优势是您可以轻松区分开盘价和收盘价。但是它们很难输入,而且它们不是 ASCII。 (我必须将它们放在标题中,以使它们在 StackOverflow 字体中完全可见。)

希望有一天,当 ASCII 是只有历史学家关心的东西,而键盘已经变成了完全不同的东西(如果我们甚至要拥有键盘的话),将会出现一种使用更好引号的编程语言......

【讨论】:

  • Latex 使用 ASCII 符号和标准美式键盘区分打开(AKA 反引号)和关闭(AKA 撇号)引号。当然,这需要程序员为双引号键入两个符号,并且系统对管理引号的人有合理的认识。注意:无法在评论中转义反引号以显示它...
【解决方案3】:

Python 确实有一个替代的字符串分隔符,带有三双引号 """Some String"""。

单引号和双引号用于大多数语言,因为这是大多数书面语言的标准分隔符。

【讨论】:

  • 谢谢,这是我忘记的一个非常有用的技术。
  • 我可能会与“大多数书面语言的标准分隔符”有所不同。例如,法国人使用« and » - 中国人使用什么?等等等等。不如说它是“英文中使用的标准分隔符”。
  • 是的,这就是我喜欢 python 的原因之一。我想我对任何长度超过两个字符的字符串都使用“””。
  • 至于其他引号类型的符号,它们根本不在键盘上。 @#$​​%^&* 可用于其他用途。
【解决方案4】:

语言(应该)尽量简单易懂,使用与引号不同的东西来处理字符串会引入不必要的复杂性。

【讨论】:

  • 我知道编程语言试图像书面语言一样阅读,但很难说使用引号来分隔字符串会降低复杂性——我们经常需要解决它们,它们会带来巨大的安全问题。
  • 无论您选择何种转义字符,安全问题仍然存在,因为它们会蓄意恶意...
  • 问题是它是否引入了不必要的复杂性。如果另一个引用符号有真正的优势,我们可以学习和使用它,就像我们已经学习了我们使用的所有其他奇怪的标点符号一样。
  • 在引用中使用非引用会造成不必要的复杂性。有人可能会争辩说,即使使用单引号也是不必要的:英语中的引号(我不敢描述我不知道的其他语言)对于“撇号”是单引号,对于常规引号是双引号。唯一的问题是将引号放在带引号的字符串中 - 并且引号的含义重载以包含其他内容。
  • 使用非引号会产生复杂性,但如果它解决了问题,它可能是值得的。顺便说一句,您对英语的了解有限。很多书籍(主要来自池塘的英语方面)使用单引号作为标准引号。
【解决方案5】:

Python 有一个额外的字符串类型,使用三重双引号,

"""like this"""

除此之外,Perl 允许你使用任何你想要的分隔符,

q^ like this ^

我认为在大多数情况下,使用常规字符串分隔符是因为它们有意义。字符串用引号括起来。除此之外,大多数开发人员习惯于使用他们的常识来处理字符串,从而彻底改变字符串的呈现方式可能是一个困难的学习曲线。

【讨论】:

    【解决方案6】:

    使用引号将一组字符定义为与封闭文本分开对我们来说更自然,因此更易于阅读。此外," 和 ' 在键盘上,而您提到的其他字符没有,因此更容易键入。也许可以使用键盘上广泛使用的字符,但我想不出一个赢了'没有同样的问题。

    E:我错过了管道字符,这实际上可能是一个可行的替代方案。除了目前广泛用作 OR 运算符,可读性问题仍然存在。

    【讨论】:

    • 管道字符可能很好。它通常看起来像无衬线字体的 l 或 I,但这不是世界末日。我更喜欢像 这样的东西 - 但同样,这些也用于小于和大于。
    • 我不认为可读性是一个有效的论点。每当您阅读一种您不知道的编程语言时,它就会开始变得难以阅读。学习一门语言部分是为了学习它的语法,并且在看到 $x = \hello\; 一天之后这看起来完全正常。
    • 如果键盘上的字符不是问题,我可能会使用法语中使用的引号(« 和 »)。 (当然,对于法国人来说,键盘上没有这些字符通常不是问题。:-))但是,唉,程序员很懒,不想敲出 4 笔转义序列每次他们想输入字符串分隔符时,在数字小键盘上(如果你按 Alt 键计数,则为 5)(或者你的操作系统让你输入替代字符的任何操作),所以我们几乎被我们所坚持的暂时拿到了。
    【解决方案7】:

    啊,所以你想要老式的 FORTRAN,你可以通过计算字符串中的字符数并将其嵌入 H 格式来引用,例如:13HHello, World!。作为在语言名称全部大写的日子里用 FORTRAN 做一些事情的人,引号和转义它们是一件好事。 (例如,如果您的手动字符数少了一个,您并没有完全搞砸。)

    说真的,没有理想的解决方案。在某些时候,总是有必要拥​​有一个包含您喜欢的任何引号字符的字符串。出于实际目的,引号分隔符需要在键盘上并且易于访问,因为它们被大量使用。如果字符串包含每个可能字符的示例,Perl 的q@...@ 语法将失败。 FORTRAN 的 Hollerith 常数更差。

    【讨论】:

    • +1 表示你的 FORTRANe。没有人说中世纪的 FORTRAN 了...
    【解决方案8】:

    因为您列出的其他字符不是 ASCII。我不确定我们是否已经准备好,或者需要一种 unicode 编程语言...

    编辑:至于为什么不使用 {},|或\,这些符号在大多数语言中都已经具有含义。想象一下 C 或 Perl 对 '{' 和 '}' 有两种不同的含义!

    |表示或,并且在某些语言中已经连接字符串。如果 \ 是分隔符,您将如何获得 \n?

    基本上,我真的不明白为什么这是个问题。 \" 真的那么难吗?我的意思是,在 C 语言中,你经常需要使用 \%、\ 和其他几个两个字符的字符,所以......嗯。

    【讨论】:

    • 非常好。然而,随着网络的发展,几乎所有的重大项目最终都被移植到了其他语言上。要支持英语以外的几乎任何主要语言,都需要 UTF-8,或者至少比 ASCII 多。因此,大多数专业的文本编辑器现在都支持 UTF-8 和其他字符集,我预计这种趋势将继续下去。
    • 编辑一定能搞定。但是编译器可以吗?我们要打扰吗?
    • 不过,为了构建支持 Unicode 的应用程序,不必在源代码中使用 UTF-8 编码,而且我总是避免在我的代码中编写实际的非 ascii 字符,更喜欢转义形式,例如 "\xC2\x88" 或任何适当的语言。出于互操作性的原因,即使对于支持 Unicode 的软件,我认为仍然有一个很好的论据反对在源代码中要求非 ascii 字符。
    • 一个国际化的应用程序,即一个支持多种语言的应用程序,无论如何都应该将其所有语言字符串与源代码分开,因此它们可以采用像 XML 这样的格式,用于识别正确字符的方法编码定义明确。
    【解决方案9】:

    因为没有人使用其他流行的字符创建一种语言。

    我认为这很大程度上是因为改变角色的需求并不存在,大多数程序员已经习惯了标准的报价,并没有看到改变现状的令人信服的理由。

    比较以下。

    print "This is a simple string."
    print "This \"is not\" a simple string."
    
    print ¤This is a simple string.¤
    print ¤This "is not" a simple string.¤
    

    我真的不觉得第二个更容易或更易读。

    【讨论】:

    • 问题不在于可读性,而在于不断处理必须转义引号、记住它们是否被转义、处理可能的攻击、验证用户输入等的麻烦。如果您要使用一个字符来包含字符串,那么它应该是一个永远不会出现在字符串中的字符不是很明显吗?在其他 cmets 中,有几个人表示他们很欣赏 Perl 中的 qq 和 Python 中的 """ 的能力。
    【解决方案10】:

    您说“必须竭尽全力正确处理引号”;但它只存在于文本表示中。所有现代语言都将字符串视为二进制块,因此它们实际上并不关心内容。请记住,文本表示只是程序员告诉系统该做什么的一种简单方式。一旦字符串被保留,管理引号就没有任何问题了。

    【讨论】:

    • 那很好,但是在 PHP 中构建 MySQL 查询怎么样,你发送的只是一个字符串?参数化是可能的,但它并不简单,大多数人从不费心。
    • 当然,SQL 在这方面有问题,这不是 PHP 的错。只是从不将变量字符串放入 SQL 文本中。始终使用绑定。
    【解决方案11】:

    一个很好的理由可能是,如果这是您想要改进现有语言的唯一方面,那么您并没有真正创建一种新语言。

    如果您正在创建一种新语言,那么为字符串引号选择正确的字符可能会在实际实现的待办事项列表中大大降低。

    【讨论】:

      【解决方案12】:

      您可能最好选择一个存在于所有常见键盘和终端表示集上的分隔符,所以您建议的大多数都是正确的......

      在任何情况下,引用机制仍然是必要的……您可以减少使用引用的次数,但代价是使非专业人士更难阅读该语言。

      所以不完全清楚这是一场胜利,然后是习惯的力量。

      【讨论】:

        【解决方案13】:

        Ada 不对字符串使用单引号。这些仅用于字符,不必在字符串中转义。

        我发现双引号字符很少出现在我输入计算机程序的普通文本字符串中。当它发生时,几乎总是因为我将该字符串传递给命令解释器,并且需要在其中嵌入另一个字符串。

        我想这些其他字符都没有用于字符串分隔符的主要原因是它们不在原始的 7 位 ASCII 代码表中。如今,这可能不是一个好的借口,但在大多数语言设计者都害怕反对疯狂蹩脚的 C 语法的世界里,你不会因为一个不寻常的字符串分隔符选择而得到很多人。

        【讨论】:

        • 产品名称中经常出现双引号:例如 Converse "Chuck Taylor" 篮球鞋。
        【解决方案14】:

        Python 允许您混合使用单引号和双引号来在字符串中放置引号。

        print "Please welcome Mr Jim 'Beaner' Wilson."
        >>> Please welcome Mr Jim 'Beaner' Wilson.
        
        print 'Please welcome Mr Jim "Beaner" Wilson.'
        >>> Please welcome Mr Jim "Beaner" Wilson
        

        您也可以使用前面提到的三引号。这些还延伸到多行,让您也不必打印换行符。

        print """Please welcome Mr Jim "Beaner" Wilson."""
        >>> Please welcome Mr Jim "Beaner" Wilson
        

        最后,您可以像其他人一样打印字符串。

        print "Please welcome Mr Jim \"Beaner\" Wilson."
        >>> Please welcome Mr Jim "Beaner" Wilson
        

        【讨论】:

        • 在我遇到的所有处理字符串的方法中,我最喜欢 Python 的方法。
        猜你喜欢
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        相关资源
        最近更新 更多