Проблемы с кодировкой

  • Автор темы Young Programmer
  • Дата начала
Y

Young Programmer

#1
Люди добрые. Переустановил Windows, теперь в консоли не отображаются русские буквы:

Код:
using System;
using System.Collections.Generic;
using System.Text;



namespace ANSITABLE
{
class Program
{
static void Main(string[] args)
{
int i;
char ch;

for (i = 1; i < 255; i++)
{
ch = (char)i;
Console.WriteLine("Symbol {0,7} {1}", i, ch);
}
}
}
}
На месте русских букв либо ? либо другие символы.
Как исправить это можно? Желательно исправить в самой Windows, а не программно. Помогите плизз.
 
P

Pasha

#2
Для: Young Programmer
В Control Panel / Regional and language options, на последней закладке установи русский как язык для неюникодовых программ.
З.Ы. А в .net char 16-битовый.
 
Y

Young Programmer

#3
Уважаемый Pasha! Русский язык был установлен, но на всякий случай изменил на русский еще раз. Результат тот же. Знак ? или английские буквы вместо русских. Я знаю, что char 16-битовый, но как это относится к моей проблеме? Я некорректно применил этот тип? Если есть ошибка укажите пожалуйста, интересно.
 
P

Pasha

#4
Для: Young Programmer
char 16-битовый, принимает значения от 0 до 65535. Коды русских букв начинаются где-то с 1072. А у вас цикл всего до 255.
 
Y

Young Programmer

#5
Мммм... может я что-то не то понимаю, но передо мною ASCII таблица, в ней русские буквы начинаются с 128 позиции и заканчиваются 175. Английские буквы в этой же таблице отображаются как надо. Проверил с 1072, да, действительно русские буквы. Но все-таки интересует почему не хотят отображаться русские буквы, находящиеся на 128-175 позиции ASCII таблицы... Или я конкретно что-то не понимаю? :)
 
P

Pasha

#6
Для: Young Programmer
ASCII таблица - это коды символов в кодировке ASCII. В ней всего 127 символов.
Код:
Encoding encoding = Encoding.ASCII;
byte [] bytes = new byte[1];

for (int i = 0; i < 256; i++)
{
bytes[0] = (byte)i;
char ch = encoding.GetChars(bytes)[0];
Console.Write(ch);
if (i % 16 == 15)
{
Console.WriteLine();
}
}
А то, что ты хочешь вывести - таблица для кодовой страницы 1251, koi8-r или еще какой-то кодировки с русскими символами. Замени Encoding.ASCII на Encoding.GetEncoding(1251), Encoding.GetEncoding("koi8-r") и посмотри на результат.
 
Y

Young Programmer

#7
А, понятно :\ Просто у меня какая-то таблица ASCII символов, там их 255. Меня обманули :)...
Теперь более менее ясно. Спасибо за разъяснения!
 
P

Pretorian

#8
C# использует unicode символы это 16-бит,
ASCII 8-бит. Раньше все было в ASCII пока не пришел век unicode. Таблица ASCII может еще пригодится :), невыкидывай ее, многое использует именно ее. Если использовать ASCII то символы свыше 127, могут различатся у национальных кодировок, а в unicode нет различия. Т.е. написал прогу на русском в unicode, ее будут видеть на русском все, а если в ASCII то только те у кого потдерживается русский язык.