2013-03-07 17 views
9

Może to być niedojrzały pytanie, można ja czegoś brakuje, ale moje pytanie jestChar int konwersję dostać ASCII

Próbuje przekonwertować char do int uzyskać ASCII wartość tej char, w większości przypadków Otrzymuję prawidłowy/oczekiwany kod ASCII dla konkretnego char, w niektórych przypadkach nie. Czy ktoś może mi wyjaśnić, dlaczego?

Przykłady:

// Example 1:- 

Console.WriteLine((int)'a'); 

// gives me 97 perfect! 

// Example 2:- 

Console.WriteLine((char)1); gives me ☺ 

// now 

Console.WriteLine((int)'☺'); 

// this should give me 1, instead it gives me 9786 why? 

Dzieje się tak ASCII>127 lub ASCII < 32.

+0

Może to być coś, czego szukasz: [link] (http://stackoverflow.com/questions/3665757/c-sharp-convert-char-to-int) – Brandon

+0

Nie ufałbym wyświetlanemu znakowi być unikalną reprezentacją podstawowej wartości znaku, szczególnie w przypadku tych znaków o niskiej wartości. – hatchet

Odpowiedz

12

\01 jest postacią niedrukowalną, ponieważ konsola wyników może dowolnie zmieniać ją, aby była widoczna.

Również domyślna konsola systemu Windows nie jest przyjazna dla Unicode, więc dziwne rzeczy dzieją się podczas drukowania znaków spoza domyślnego zakresu ASCII do wydrukowania.

+0

Wydaje się, co to jest, dzięki za wyjaśnienie. – din

4

Po pierwsze, nie ma czegoś takiego jak "ASCII> 127" - ASCII idzie tylko do 127 (lub 126, nigdy nie pamiętam, czy delete jest właściwie częścią ASCII).

Zasadniczo przy drukowaniu znaków niedrukowalnych, takich jak U + 0001 ("Początek nagłówka"), do urządzenia wyświetlającego należy ustalenie, co z tym zrobić. Niektóre konsole będą drukować kwadraty, inne będą drukować emotikony itp. Na pewno nie należy oczekiwać, że będzie on odwracalny. Ci może oczekiwać sama konwersja być odwracalny w kodzie choć:

char c = '\u0001'; 
int i = c; // i = 1 
char d = (char) i; 
Console.WriteLine(c == d); // True 
+0

Rozszerzone kody ASCII http://www.asciitable.com/ – din

+1

@DineshB: To nie jest ASCII. "Rozszerzony ASCII" jest * upiornym * terminem, który ogólnie oznacza "każde jedno bajtowe kodowanie, które jest zgodne z ASCII do 127". Zobacz http://pl.wikipedia.org/wiki/ASCII - "ASCII zawiera definicje dla 128 znaków" –

+0

Gotchu, moje złe to cytować to jako ASCII – din

1

W odpowiedzi na pytanie, dlaczego Console.WriteLine((int)'☺'); zwrotu 9786, to dlatego „☺” Unicode jest reprezentowany przez bajtów 58 38, który reprezentowana przez liczbę całkowitą to 9786.

Znaki w C# są znakami Unicode.