【问题标题】:curious case of hyphen and dash连字符和破折号的奇怪案例
【发布时间】:2011-03-27 17:29:03
【问题描述】:

我正在尝试从 Oracle 9i 数据库中获取特定列的值为“FOO - BAR”的记录。

'FOO - BAR' 条件值存在于表中,但是当我运行查询时,结果没有出现。

在打破我的头一段时间后,发现hypen的大小有所不同。

'FOO – BAR'
'FOO - BAR'

这次我复制(通过 SQLDeveloper)数据库值并将该值粘贴到 Eclipse IDE 中。我没有看到 Eclipse 有任何区别。当我从 IDE 运行查询时,令我惊讶的是它起作用了并且值即将到来。

我将相同的类文件部署到我们的服务器(UX 框),然后再次回到第 1 格 - 值没有出现。

我尝试将 IDE 的文件编码从默认 (Cp1252) 更改为 UTF-8,现在一切正常。

有人可以解释发生了什么吗?连字符的大小会因编码而异吗? 我们有three 不同类型的破折号吗?

【问题讨论】:

标签: java sql encoding hyphen


【解决方案1】:

em-dash、en-dash、hyphen 等有很多不同的 Unicode 字符。它们在文本中的不同上下文中使用。

您可能需要阅读"Dash" wikipedia article 了解更多信息。请注意,hyphen 并不完全相同:)

至于编码是如何产生的——这将取决于您如何插入、检索和显示数据。我不会开始使用剪切和粘贴 - 这很可能会尝试找到与数据库中表示的实际数据最接近的可用值。

【讨论】:

    【解决方案2】:

    我们有三种不同的破折号吗?

    是的。事实上,根据您将什么视为破折号,连字符和破折号的 Unicode 代码点远不止 3 个。 (并且@Jon Skeet 链接到的页面甚至没有列出所有破折号字符。例如,U2500 代码平面中有 4 个“水平破折号”代码点......以及“垂直破折号”和“双破折号” .)

    连字符的大小会因编码而异。

    这是一个无法回答的问题。连字符的实际大小取决于渲染软件在屏幕或页面上的渲染方式。然而,事实仍然是,在某些字符集中,有不同的代码点在概念上表示不同大小的连字符或破折号。严格来说,这与编码 本身无关。

    这里可能发生的情况是,字符在不同点从一个字符集映射到另一个字符集。在某些时候,目标字符集不支持多个连字符/短划线字符,并且映射正在悄悄地将“时髦”连字符转换为“普通”连字符。

    剪切和粘贴字符对您没有帮助。您需要一种方法来查看十六进制的实际代码点值。

    【讨论】:

      【解决方案3】:

      试试 从表中选择 rawtohex(col)

      • 我离开了我的 oracle 实例,但我认为这可以凭记忆进行 它给你一个十六进制转储,然后查找代码

      【讨论】:

        【解决方案4】:

        您可以借助 ASCII() Oracle 函数发现存储在数据库中的真实代码。 例如

        select ascii(substr(t.strng_field, 5, 1)) from string_table t
        

        但真正处理此类情况的函数取决于字符串列的数据库字符集和填表的数据源。

        您可以从convertdecomposeunistr 列出的here 等字符串字符集翻译函数中进行选择。

        【讨论】:

          猜你喜欢
          • 2014-12-08
          • 2018-11-13
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2015-02-26
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多