在C#字符串中获取字符的ASCII值

36

考虑以下字符串:

string str="A C# string";

使用C#打印str中每个字符的ASCII值最有效的方法是什么?

1
请定义“最有效率”。 :) 另外,这可能是如何在C#中获取字符串的ASCII值的重复问题。此处您是否真的指的是ASCII? - bzlm
6
技术上来说,C# 字符使用的是 UNICODE 而不是 ASCII。 - Frédéric Hamidi
4个回答

39

将每个字符强制转换为int:

for (int i = 0; i < str.length; i++)  
  Console.Write(((int)str[i]).ToString());

1
那不会限制为ASCII码,对吧? - bzlm
1
+1 - 也可以使用 foreach(char c in str.ToCharArray()) 进行迭代。 - Joel Etherton
只要字符是ASCII,你就会得到ASCII码,如果在字符串中使用Unicode字符,你也会得到它们的值。强制转换有什么问题吗?毕竟,字符本身的表示方式就是一个整数(如果我没记错的话,是4个字节)。 - Jorge Córdoba
不是所有字符都是2个字节,所以不是short类型。但是是的,完整的Unicode需要32位,有些字符被拆分成两个16位字符(代理项)。 - xanatos
2
@Joel:或者你可以直接使用 foreach (char c in str) 进行迭代。甚至不需要用 ToCharArray - LukeH
显示剩余2条评论

21

如果您不喜欢将值转换为int,这里有另一种选择:

foreach(byte b in System.Text.Encoding.UTF8.GetBytes(str.ToCharArray()))
    Console.Write(b.ToString());

2
@Petoj - 这是直接从MSDN文档中提取的有关转换为ASCII的内容。 "正确"的方法应该是调用ConvertToUTF32(),因为这才是字符本身的真正编码。 - Joel Etherton
1
它可能来自MSDN,但我不同意你的观点,即它是正确的。首先ASCII只包含7位字符,而UTF8包含更多字符;其次,一些UTF8字符保存为2个字节(或更多),因此您无法确定哪个字符是哪个字节了... - Peter
1
@Joel Etherton - 所以你只是复制粘贴一个答案,我们不应该指出它没有按照预期工作吗? - Peter
3
Unicode编码从0到127与七位ASCII编码相同。如果原帖希望获得包含没有ASCII编码的字符的字符串的“ASCII”数据,则原帖需要澄清问题,因为目前还不清楚。 - Eric Lippert
7
请将关于UTF8的投诉直接提交给Unicode联盟,Microsoft只是该联盟的一个成员。你也可以向苹果、甲骨文、谷歌、IBM、微软、SAP、Yahoo!以及印度联邦政府提出投诉。微软只是Unicode标准化过程中众多重要参与者之一。 - Eric Lippert
显示剩余5条评论

4

这个例子可能会帮到您。通过简单的转换,您可以获得乌尔都字符的代码。

string str = "عثمان";
        char ch = ' ';
        int number = 0;
        for (int i = 0; i < str.Length; i++)
        {
            ch = str[i];
            number = (int)ch;
            Console.WriteLine(number);
        }

因为 string 是一个计数的 UTF-16 代码单元序列(其中一个或两个编码 Unicode 代码点),所以这将获取 UTF-16 代码单元。代码点更加符合人类阅读习惯。要获取它们,请转换为 UTF-32,因为 UTF-32 代码单元和 Unicode 代码点是一对一的,并且具有相同的值。 - Tom Blodget

0

这里有另一种选择。当然,如果输入字符不是ASCII码,它会给你一个错误的结果。我没有进行性能测试,但我认为它应该非常快:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int GetAsciiVal(string s, int index) {
    return GetAsciiVal(s[index]);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int GetAsciiVal(char c) {
    return unchecked(c & 0xFF);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接