如何根据给定的ASCII值获取字符

90

如何根据ASCII编码获取对应的ASCII字符。

例如,如果给出编码65,则需要返回"A"。

谢谢


可能是如何在c#中从ASCII字符代码获取Char的重复问题。 - Tim Pohlmann
9个回答

173

您是指 "A"(一个 string),还是 'A'(一个 char)?

int unicode = 65;
char character = (char) unicode;
string text = character.ToString();

请注意,我提到的是 Unicode 而不是 ASCII,因为那是 C# 的本地字符编码;实际上每个 char 是一个 UTF-16 代码点。


@Jon Skeet:如果我将Unicode设置为128,为什么我无法获得相应的字符呢? - Iorn Man
@Jon Skeet:实际上我想显示0x80、0x81到0xFF的字符值(我将这些值转换为十进制即128-255,但我无法得到相应的符号)。我该如何显示这些符号呢? - Iorn Man
@EthanHunt:你所说的“字符值”是什么意思?U+0080是控制字符-你希望它如何显示?我怀疑你实际上是在谈论其他编码中的值128-255,但你没有告诉我们那是哪种编码。 - Jon Skeet
@Jon Skeet:其实我是C#的新手,我正在开发一个虚拟键盘应用程序,在其中我想将这些字符设置为按钮的文本。 - Iorn Man
@EthanHunt:这与C#无关,完全是因为您似乎不理解Unicode。您需要找出真正感兴趣的编码方式,并将那些值转换为Unicode字符。 - Jon Skeet
显示剩余3条评论

37
 string c = Char.ConvertFromUtf32(65);

c 将包含 "A"


15

这在我的代码中有效。

string asciichar = (Convert.ToChar(65)).ToString();

返回:asciichar = 'A';


13

有几种方法可以实现这个。

使用char结构体(转换为字符串再转回来)

string _stringOfA = char.ConvertFromUtf32(65);

int _asciiOfA = char.ConvertToUtf32("A", 0);

只需将值进行强制类型转换即可(包括字符和字符串)

char _charA = (char)65;

string _stringA = ((char)65).ToString();

使用 ASCIIEncoding。
这可以在循环中用于处理整个字节数组。

var _bytearray = new byte[] { 65 };

ASCIIEncoding _asiiencode = new ASCIIEncoding();

string _alpha = _asiiencode .GetString(_newByte, 0, 1);

你可以重写类型转换器类,这将允许您对值进行一些高级验证:

var _converter = new ASCIIConverter();

string _stringA = (string)_converter.ConvertFrom(65);

int _intOfA = (int)_converter.ConvertTo("A", typeof(int));

这是该类:

public class ASCIIConverter : TypeConverter
{
    // Overrides the CanConvertFrom method of TypeConverter.
    // The ITypeDescriptorContext interface provides the context for the
    // conversion. Typically, this interface is used at design time to 
    // provide information about the design-time container.
    public override bool CanConvertFrom(ITypeDescriptorContext context,
       Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }


    // Overrides the ConvertFrom method of TypeConverter.
    public override object ConvertFrom(ITypeDescriptorContext context,
       CultureInfo culture, object value)
    {

        if (value is int)
        {
            //you can validate a range of int values here
            //for instance 
            //if (value >= 48 && value <= 57)
            //throw error
            //end if

            return char.ConvertFromUtf32(65);
        }
        return base.ConvertFrom(context, culture, value);
    }

    // Overrides the ConvertTo method of TypeConverter.
    public override object ConvertTo(ITypeDescriptorContext context,
       CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return char.ConvertToUtf32((string)value, 0);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

2
这是一个适用于所有256个字节的函数,它确保您将看到每个值的字符:
static char asciiSymbol( byte val )
{
    if( val < 32 ) return '.';  // Non-printable ASCII
    if( val < 127 ) return (char)val;   // Normal ASCII
    // Workaround the hole in Latin-1 code page
    if( val == 127 ) return '.';
    if( val < 0x90 ) return "€.‚ƒ„…†‡ˆ‰Š‹Œ.Ž."[ val & 0xF ];
    if( val < 0xA0 ) return ".‘’“”•–—˜™š›œ.žŸ"[ val & 0xF ];
    if( val == 0xAD ) return '.';   // Soft hyphen: this symbol is zero-width even in monospace fonts
    return (char)val;   // Normal Latin-1
}

如果目标是获取每个ASCII码点的可见Unicode码点,那么可以使用控制图片来替换C0控制字符。␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏... - Tom Blodget
1
@TomBlodget 很高兴知道,但这不是回答问题的答案。请随意提交另一个可以完成 OP 要求的 C# 函数。 - Soonts
1
请注意,ASCII 只能到 127。任何超过该范围的字符都不是 ASCII,因此至少可以说您的方法命名不当。 - Jon Skeet
它还可以处理意外的数字,太棒了。 - Sayed Muhammad Idrees
@TomBlodget,有没有参考你提到的控件的库?还是我们需要自己创建? - Ozgur Saklanmaz

1

它也可以以其他方式完成

byte[] pass_byte = Encoding.ASCII.GetBytes("your input value");

然后使用 foreach 循环打印结果。


1

只需尝试这个:

int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("data is: {0}", Convert.ToChar(n));

-2

我相信一个简单的转换可以解决问题

int ascii = (int) "A"


现在他需要帮助解决相反的问题,即如何从数字中获取一个字符。 - StefanE
11
无论如何给定的代码都无法编译——你不能从string转换为int。如果是'A'的话,那么它就可以工作了,但强制转换是多余的,因为有一个隐式的从charint的转换。 - Jon Skeet

-3

抱歉,我不懂Java,但今晚我遇到了同样的问题,所以我写了这个(它是用C#编写的)

public string IncrementString(string inboundString)    {
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(inboundString.ToArray);
bool incrementNext = false;

for (l = -(bytes.Count - 1); l <= 0; l++) {
    incrementNext = false;

    int bIndex = Math.Abs(l);
    int asciiVal = Conversion.Val(bytes(bIndex).ToString);

    asciiVal += 1;

    if (asciiVal > 57 & asciiVal < 65)
        asciiVal = 65;
    if (asciiVal > 90) {
        asciiVal = 48;
        incrementNext = true;
    }

    bytes(bIndex) = System.Text.Encoding.ASCII.GetBytes({ Strings.Chr(asciiVal) })(0);

    if (incrementNext == false)
        break; // TODO: might not be correct. Was : Exit For
}

inboundString = System.Text.Encoding.ASCII.GetString(bytes);

return inboundString;
}

要获取每一种组合,只需在循环中运行它即可。 - user4914655
代码完全乱了! - Sayed Muhammad Idrees

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