.NET 中的字符串是 UTF-16 代码单元的序列。 (Java、JavaScript、HTML、XML、XSL、Windows API 等也是如此)字符串的 .NET 数据类型是 String,UTF-16 代码单元的 .NET 数据类型是 Char。在 C# 中,您可以使用它们或其关键字别名 string 和 char。
UTF-16 是 Unicode 字符集的几种编码之一。它将每个 Unicode 代码点编码为一个或两个代码单元。当使用两个代码单元时,它们被称为代理对,按顺序是高代理,然后是低代理。
ASCII 是 Unicode 的一个子集。与 ASCII 相同的 Unicode 字符正好是 U+0000 到 U+007F。 UTF-16 将它们分别编码为一个代码单元:'\u0000' 到 '\u007F'。 ASCII 字符集的单一编码将每个字符编码为一个字节:0x00 到 0x7f。
问题陈述涉及“string”、“alphabet”、“ASCII”、“C#”和“console”。这些中的每一个都必须被理解。
不幸的是,有些人使用“ASCII”来表示“字符代码”。在“C#”“字符串”的上下文中,字符代码表示 Unicode 代码点或 UTF-16 代码单元。您可以做一个简化的假设,即输入字符不需要 UTF-16 代理对,甚至范围是 U+0000 到 U+007F。
“字母”既是一个数学术语,也是一个语言术语。在数学(和计算机科学)中,“字母表”是一组象征性的事物,通常有顺序。在语言学中,“字母表”是在特定语言的书写系统中使用的一系列基本字母。它通常由“语言学院”定义,可能包括也可能不包括该语言中使用的所有字母形式。例如,公认的英文字母不包括带有任何变音符号或重音符号或连字的字母,即使它们用于英文单词。此外,在书写系统中,部分或全部字母可以有大写、小写、首字母大写或其他形式。对于这个问题,由于提到了 ASCII 并且 ASCII 包含大写和小写的基本拉丁字母,您可以定义两个技术字母 A-Z 和 a-z,按它们的 UTF-16 代码单元值排序。
由于您想为字母表中的每个字符增加字符代码,因此您必须决定如果结果不再在您的字母表中会发生什么。结果是否真的是一个字符,因为肯定有最后一个可能的字符(或许多不同的 UTF-16 代码单元范围)?您可能会考虑环绕到字母表中的第一个字符。 Z->A,z->a。
最后是“控制台”。控制台具有字符编码设置。 (去chcp 看看你的是什么。)你的程序将从控制台读取和写入。当你写入它时,它会使用一种字体来生成接收到的字符的图像。如果一切顺利,那就太好了。如果没有,您可以询问有关它的问题。底线:当程序读写时,输入/输出函数进行编码转换。因此,在您的程序中,String 和 Char 的编码是 UTF-16。
现在,String 是 Char 的序列,因此您可以使用多种分解技术,包括 foreach:
foreach (Char c in inputString)
{
if (Char.IsSurrogate(c)) throw new ArgumentOutOfRangeException();
if (c > '\u007f') throw new ArgumentOutOfRangeException();
// add your logic to increment c and save or output it
}