我只是好奇 .ToUpper() 是如何工作的?是否存在某种映射,较低的 a 具有 UTF 代码 XYZ,而较高的 a 具有 UTF 代码 XYZ1?
4 回答
是的,它使用了 Unicode 元数据。每个字符(Unicode 代码点)都有一个大小写以及大小写(和标题大小写)的大小写映射。.NET 使用此信息将字符串转换为大写或小写。您可以在Unicode 字符数据库中找到完全相同的信息。
String.ToUpper只使用CurrentCulture
in 核心。
形成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提供有关主题的更多信息。
之前在 StackOverflow 上(以一种迂回的方式)问过这个问题。当然,这不是关于 C# 或 .NET,而是回答了这个问题的 Unicode 部分。
如果您对 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
希望这些信息有所帮助。