【问题标题】:Is there an uppercase letter that has two lowercase alternatives?是否有一个有两个小写替代的大写字母?
【发布时间】:2020-10-07 02:22:50
【问题描述】:

ch1ch2ch1 <> ch2ch1ch2 是否有任何两个字符是小写字母,其中uppercase(ch1) == uppercase(ch2)? Unicode中真的有这样的字符吗?

一个后续问题是:对于任何一个小写字母的ch,以下表达式是否总是正确的?

ch == lowercase(uppercase(ch))

【问题讨论】:

  • 是的,这些字符有很多,但更复杂的是,小写()和大写()的结果取决于您使用的语言环境。见doted and dotless I
  • 这个问题可能只是出于好奇,但也许不是。是否存在您要解决的潜在问题?因为如果有的话,很有可能它已经有了解决方案。
  • @JoachimSauer 我的根本问题是我正在考虑一种特定的算法来解决对区分大小写的标识符的不区分大小写的引用。上面的假设很重要,但现在我发现我不能使用它。
  • 您可以使用具有正确语言环境和强度的Collator 构建ColationKeyCollationKeys 的比较速度非常快,因为它们只是进行二进制比较。您可以为所有标识符预先构建CollationKeys,并使用相同的Collator 从输入参数中进行查找。请注意,这仍然需要 specfic 语言环境才能正常工作(您不能真正忽略它,因为大小写折叠规则因语言环境而异)。
  • @JoachimSauer 我的问题不同。让我们坚持这个问题,我认为它总体上很有趣。

标签: unicode uppercase lowercase


【解决方案1】:

用 Java 做了一个快速测试:

public static void main(String[] args) {
    for (char ch1 = 0; ch1 < 65534; ch1++) {
        if (!isLetter(ch1) || !isLowerCase(ch1)) {
            continue;
        }
        String s1 = "" + ch1;
        for (char ch2 = (char) (ch1 + 1); ch2 < 65535; ch2++) {
            if (!isLetter(ch2) || !isLowerCase(ch2)) {
                continue;
            }
            String s2 = "" + ch2;
            if (s1.toUpperCase(Locale.US).equals(s2.toUpperCase(Locale.US))) {
                System.out.println("ch1=" + ch1 + " (" + (int) ch1 + "), ch2=" + ch2 + " (" + (int) ch2 + ")");
            }
        }
    }
}

打印出来:

ch1=i (105), ch2=ı (305)
ch1=s (115), ch2=ſ (383)
ch1=µ (181), ch2=μ (956)
ch1=ΐ (912), ch2=ΐ (8147)
ch1=ΰ (944), ch2=ΰ (8163)
ch1=β (946), ch2=ϐ (976)
ch1=ε (949), ch2=ϵ (1013)
ch1=θ (952), ch2=ϑ (977)
ch1=ι (953), ch2=ι (8126)
ch1=κ (954), ch2=ϰ (1008)
ch1=π (960), ch2=ϖ (982)
ch1=ρ (961), ch2=ϱ (1009)
ch1=ς (962), ch2=σ (963)
ch1=φ (966), ch2=ϕ (981)
ch1=в (1074), ch2=ᲀ (7296)
ch1=д (1076), ch2=ᲁ (7297)
ch1=о (1086), ch2=ᲂ (7298)
ch1=с (1089), ch2=ᲃ (7299)
ch1=т (1090), ch2=ᲄ (7300)
ch1=т (1090), ch2=ᲅ (7301)
ch1=ъ (1098), ch2=ᲆ (7302)
ch1=ѣ (1123), ch2=ᲇ (7303)
ch1=ᲄ (7300), ch2=ᲅ (7301)
ch1=ᲈ (7304), ch2=ꙋ (42571)
ch1=ṡ (7777), ch2=ẛ (7835)
ch1=ſt (64261), ch2=st (64262)

所以答案是:是的,有不同的字符具有相同的大写表示。

【讨论】:

  • 这可能不是它所要求的。
【解决方案2】:

大写、标题和小写字母是特定于语言环境的,因此在不同的语言环境中,您可能有不同的小写字母(例如,法语大写字母可能会丢失重音符号)。

但 Unicode 还定义了转换为大写或小写的标准方法,但土耳其语除外,它可能有不同的规则(在 CaseFolding.txt Unicode 数据库中标记为 T,以及进一步特殊的土耳其语、希腊语和立陶宛语的案例,在 SpecialCasing.txt)。

在大多数情况下,您有一种独特的方式将小写转换为大写(反之亦然),但请参阅 SIGN KELVIN,它使用 K 和其他符号映射,这些符号使用与其他字母相同的字形(如果您通过规范化删除兼容性字符)。

一种情况是希腊西格玛字母。大写只有一个,但小写可以使用两个不同的,这取决于它是否在单词的末尾。

您将在 Unicode 文档中找到有关 Unicode 数据库的更多信息:http://www.unicode.org/reports/tr44/#Casemapping 和 Unicode 标准(链接在文档中,以及我上面提到的两个文件)。

注意:有些字符会增加码点的数量,所以在转换回来的时候,应该检查最长的匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2019-03-18
    • 2013-11-29
    • 2021-07-30
    • 2021-12-07
    • 2014-01-11
    相关资源
    最近更新 更多