6

我只是好奇 .ToUpper() 是如何工作的?是否存在某种映射,较低的 a 具有 UTF 代码 XYZ,而较高的 a 具有 UTF 代码 XYZ1?

4

4 回答 4

3

是的,它使用了 Unicode 元数据。每个字符(Unicode 代码点)都有一个大小写以及大小写(和标题大小写)的大小写映射。.NET 使用此信息将字符串转换为大写或小写。您可以在Unicode 字符数据库中找到完全相同的信息。

于 2012-07-12T11:54:41.907 回答
0

String.ToUpper只使用CurrentCulturein 核心。

形成String.ToUpper()from的反汇编版本mscorelib.dll,可以看到:

public string ToUpper(CultureInfo culture)
{
    if (culture == null)
    {
        throw new ArgumentNullException("culture");
    }
    return culture.TextInfo.ToUpper(this);
}

所以这取决于你现在的文化。它总是有一个合适的过载,您可以在其中指定替代文化。

编辑

在内部,它在最后以其本机实现调用nativeChangeCaseString函数。它是如何在内部实现的,我不知道,因为它可以由开发它的人来回答。

正如@Tim 所建议的,添加一个链接到

TextInfo.ToUpper提供有关主题的更多信息。

于 2012-07-12T11:51:58.333 回答
0

之前在 StackOverflow 上(以一种迂回的方式)问过这个问题。当然,这不是关于 C# 或 .NET,而是回答了这个问题的 Unicode 部分。

如何在 Unicode 中将字符串设置为大写/小写?

于 2012-07-12T11:53:46.123 回答
0

如果您对 ToUpper() 实现的设计方面感兴趣,可以参考以下部分:

  • 来自 Gang of Four 设计模式目录的 FlyWeight 设计模式用于处理与字符相关的功能
  • 根据这种设计模式,集合中的每个单元都被设计为具有定义行为的对象,最终对象是较小单元的集合
  • 在 String 的情况下 - 给定的 String 实际上是作为字符数组处理的,其中每个字符都是具有定义行为的对象
  • 当我们调用 ToUpper() 时采用这种设计模式,它会迭代字符串的字符并在内部将调用委托给每个字符。在字符上调用 ToUpper 时,String 类还传递了 Locale 的引用,其中包含字符映射和编码的详细信息

如果您对实际实现感兴趣,那么您可以参考 Java 语言的 java.lang.String 类部分的开源实现 - 这相当于 C# 字符串实用程序类。

以下是您可以找到 java.lang.String 类的源代码的链接 - 有 2 个重载方法:toUpper() 和 toUpper(Locale)。在内部 toUpper() 使用默认语言环境调用 toUpper(Locale) ,因此您会对第二种方法感兴趣。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java

希望这些信息有所帮助。

于 2012-07-12T12:32:12.360 回答