2009-04-06 23 views
25

VB có một vài hàm gốc để chuyển đổi một char thành một giá trị ASCII và ngược lại - Asc() và Chr().Có gì tương đương với các hàm Asc() và Chr() của VB trong C#?

Bây giờ tôi cần có chức năng tương đương trong C#. Cách tốt nhất là gì?

+4

Xin lưu ý rằng hiếm khi có ai nói về ASCII giá trị những ngày này. Thông thường, bạn đang sử dụng các điểm mã Unicode (hoặc mã hóa UTF-16 của chúng) thay vào đó: http://www.joelonsoftware.com/articles/Unicode.html –

+5

VB.Net Asc * không * trả lại mã ASCII, * cũng không * trả về mã Unicode. Nó [trả về] (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) mã "ANSI" trong trang mã Windows hiện tại. – MarkJ

+0

@MarkJ Giống như VB6; đi con số! –

Trả lời

26

Bạn luôn có thể thêm một tham chiếu đến Microsoft.VisualBasic và sau đó sử dụng các phương pháp chính xác giống nhau: Strings.ChrStrings.Asc.

Đó là cách dễ nhất để có được cùng chức năng chính xác.

+2

Nếu bạn thêm một tham chiếu, nó sẽ tồn tại. – Samuel

+4

+1 Trên thực tế ** là đúng **, không giống như * tất cả * các câu trả lời khác. Họ sử dụng * mã hóa * khác nhau từ VB Asc và Chr và * sai *. – MarkJ

+0

@MarkJ: Tôi nghi ngờ sử dụng phổ biến nhất các giá trị sử dụng 'Asc' và' Chr' trong phạm vi 0-126, mà lập trình viên mong muốn ánh xạ tới các điểm mã Unicode tương ứng; ngay cả khi có một hệ thống, ví dụ, Chr (34) sẽ sinh ra '″' thay vì '" ', tôi sẽ nghĩ lập trình viên đã viết' Chr (34) 'có lẽ là dự định' "'. – supercat

18

Đối Asc() bạn có thể cast char một int như thế này:

int i = (int)your_char; 

và cho Chr() bạn có thể đúc lại một char từ một int như thế này:

char c = (char)your_int; 

Đây là một chương trình nhỏ thể hiện toàn bộ điều:

using System; 

class Program 
{ 
    static void Main() 
    { 
     char c = 'A'; 
     int i = 65; 

     // both print "True" 
     Console.WriteLine(i == (int)c); 
     Console.WriteLine(c == (char)i); 
    } 
} 
+11

-1 vì đây là * sai *. VB.Net Asc * không * trả lại mã ASCII, * cũng không * trả về mã Unicode. Nó [trả về] (http://msdn.microsoft.com/en-us/library/zew1e4wc (v = vs.71) .aspx) mã "ANSI" trong trang mã Windows hiện tại (tức là phụ thuộc vào ngôn ngữ của chuỗi hiện tại) . Dàn diễn viên sẽ trả về một điểm mã Unicode. Khác nhau đối với hầu hết các ký tự trên hầu hết các ngôn ngữ. Sử dụng Microsoft.VisualBasic.Strings.Asc và Chr. – MarkJ

+1

Tôi phải đồng ý với @MarkJ - Tôi đã thử mã này và nó trả lại kết quả tương tự cho một số ký tự (ví dụ a-z) nhưng kết quả khác nhau cho những người khác ("<", v.v.). – JDB

+0

Có, kết quả không giống nhau: {case 1. Strings.Chr (128) kết quả 1: 8364 '€'} {case 2. (char) 128 kết quả 2: 128 '(giá trị hộp)'} Ngoài ra, trong trường hợp thứ 2, bất kỳ giá trị nào lớn hơn 128 đều trả về 'giá trị hộp' thay vì ký tự hợp lệ. – Sadiq

2

Đối Chr(), bạn có thể sử dụng:

char chr = (char)you_char_value; 
0

Với char c và int i, và chức năng fi (int) và fc (char):

Từ char sang int (analog của VB Asc()): định rõ ràng char là int: i = (int) c;

hoặc đúc hoàn toàn (quảng bá): fi (c), i + = c;

Từ int để char (analog của VB Chr()):

đúc một cách rõ ràng int như một char: c = (char) i, fc ((char) i);

Một diễn viên tiềm ẩn là không được phép, như là một int là rộng hơn (có phạm vi rộng các giá trị) so với một char

0

Strings.Asc không tương đương với mẫu C# thuần túy cho các ký tự không phải ASCII có thể vượt quá 127 giá trị mã. Câu trả lời tôi tìm thấy trên https://social.msdn.microsoft.com/Forums/vstudio/en-US/13fec271-9a97-4b71-ab28-4911ff3ecca0/equivalent-in-c-of-asc-chr-functions-of-vb?forum=csharpgeneral lượng để một cái gì đó như thế này:

static int Asc(char c) 
    { 
     int converted = c; 
     if (converted >= 0x80) 
     { 
      byte[] buffer = new byte[2]; 
      // if the resulting conversion is 1 byte in length, just use the value 
      if (System.Text.Encoding.Default.GetBytes(new char[] { c }, 0, 1, buffer, 0) == 1) 
      { 
       converted = buffer[0]; 
      } 
      else 
      { 
       // byte swap bytes 1 and 2; 
       converted = buffer[0] << 16 | buffer[1]; 
      } 
     } 
     return converted; 
    } 

Hoặc, nếu bạn muốn thỏa thuận đọc thêm một tham chiếu đến assembly Microsoft.VisualBasic.

1

Tôi đã nhận những sử dụng resharper, mã chính xác chạy bằng VB trên máy tính của bạn

/// <summary> 
/// Returns the character associated with the specified character code. 
/// </summary> 
/// 
/// <returns> 
/// Returns the character associated with the specified character code. 
/// </returns> 
/// <param name="CharCode">Required. An Integer expression representing the <paramref name="code point"/>, or character code, for the character.</param><exception cref="T:System.ArgumentException"><paramref name="CharCode"/> &lt; 0 or &gt; 255 for Chr.</exception><filterpriority>1</filterpriority> 
public static char Chr(int CharCode) 
{ 
    if (CharCode < (int) short.MinValue || CharCode > (int) ushort.MaxValue) 
    throw new ArgumentException(Utils.GetResourceString("Argument_RangeTwoBytes1", new string[1] 
    { 
     "CharCode" 
    })); 
    if (CharCode >= 0 && CharCode <= (int) sbyte.MaxValue) 
    return Convert.ToChar(CharCode); 
    try 
    { 
    Encoding encoding = Encoding.GetEncoding(Utils.GetLocaleCodePage()); 
    if (encoding.IsSingleByte && (CharCode < 0 || CharCode > (int) byte.MaxValue)) 
     throw ExceptionUtils.VbMakeException(5); 
    char[] chars = new char[2]; 
    byte[] bytes = new byte[2]; 
    Decoder decoder = encoding.GetDecoder(); 
    if (CharCode >= 0 && CharCode <= (int) byte.MaxValue) 
    { 
     bytes[0] = checked ((byte) (CharCode & (int) byte.MaxValue)); 
     decoder.GetChars(bytes, 0, 1, chars, 0); 
    } 
    else 
    { 
     bytes[0] = checked ((byte) ((CharCode & 65280) >> 8)); 
     bytes[1] = checked ((byte) (CharCode & (int) byte.MaxValue)); 
     decoder.GetChars(bytes, 0, 2, chars, 0); 
    } 
    return chars[0]; 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
} 


/// <summary> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </summary> 
/// 
/// <returns> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </returns> 
/// <param name="String">Required. Any valid Char or String expression. If <paramref name="String"/> is a String expression, only the first character of the string is used for input. If <paramref name="String"/> is Nothing or contains no characters, an <see cref="T:System.ArgumentException"/> error occurs.</param><filterpriority>1</filterpriority> 
public static int Asc(char String) 
{ 
    int num1 = Convert.ToInt32(String); 
    if (num1 < 128) 
    return num1; 
    try 
    { 
    Encoding fileIoEncoding = Utils.GetFileIOEncoding(); 
    char[] chars = new char[1] 
    { 
     String 
    }; 
    if (fileIoEncoding.IsSingleByte) 
    { 
     byte[] bytes = new byte[1]; 
     fileIoEncoding.GetBytes(chars, 0, 1, bytes, 0); 
     return (int) bytes[0]; 
    } 
    byte[] bytes1 = new byte[2]; 
    if (fileIoEncoding.GetBytes(chars, 0, 1, bytes1, 0) == 1) 
     return (int) bytes1[0]; 
    if (BitConverter.IsLittleEndian) 
    { 
     byte num2 = bytes1[0]; 
     bytes1[0] = bytes1[1]; 
     bytes1[1] = num2; 
    } 
    return (int) BitConverter.ToInt16(bytes1, 0); 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
} 


/// <summary> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </summary> 
/// 
/// <returns> 
/// Returns an Integer value representing the character code corresponding to a character. 
/// </returns> 
/// <param name="String">Required. Any valid Char or String expression. If <paramref name="String"/> is a String expression, only the first character of the string is used for input. If <paramref name="String"/> is Nothing or contains no characters, an <see cref="T:System.ArgumentException"/> error occurs.</param><filterpriority>1</filterpriority> 
public static int Asc(string String) 
{ 
    if (String == null || String.Length == 0) 
    throw new ArgumentException(Utils.GetResourceString("Argument_LengthGTZero1", new string[1] 
    { 
     "String" 
    })); 
    return Strings.Asc(String[0]); 
} 

Tài chỉ là lưu trữ thông báo lỗi, vì vậy bằng cách nào đó theo cách bạn muốn bỏ qua chúng, và hai phương pháp khác mà bạn làm không có quyền truy cập vào như sau:

internal static Encoding GetFileIOEncoding() 
{ 
    return Encoding.Default; 
} 

internal static int GetLocaleCodePage() 
{ 
    return Thread.CurrentThread.CurrentCulture.TextInfo.ANSICodePage; 
} 
0
//Char to Int - ASC("]") 
int lIntAsc = (int)Char.Parse("]"); 
Console.WriteLine(lIntAsc); //Return 91 



//Int to Char 

char lChrChar = (char)91; 
Console.WriteLine(lChrChar); //Return "]" 
+1

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, hãy cố gắng không gắn mã của bạn với các nhận xét giải thích vì điều này làm giảm khả năng đọc của cả mã và giải thích! – FrankerZ

+0

'Asc' và' Chr' không liên quan đến ASCII hoặc thậm chí là ISO 8859-1 (đó là mã của bạn). Chúng liên quan đến 'Encoding.Default'. –

Các vấn đề liên quan