Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/79: Рейтинг темы: голосов - 79, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 14.09.2010
Сообщений: 4

Отображение символов на русском языке в DataGridView

14.09.2010, 17:00. Показов 16700. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Странно), в DataGridView не отображаются русские буквы. Вместо них вопросики). Пробовал классом UnicodeEncoding преобразовывать в UTF32 - результат тот же. Люди посоветуйте, pls. MSDN прочитал - не нашёл, в книжках порылся - результат тот же.
Заранее признателен, Степан.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2010, 17:00
Ответы с готовыми решениями:

Отображение меню на русском языке
Как на Visual C++ 6.0 отобразить меню на русском. В ресурсе меню редактирую получается абракадабра. Заранее спасибо.

Отображение сообщений об ошибках на русском языке
По-видимому, при установке клиентской части ORACLE я выбрал русский язык. Сейчас получаю все сообщения об ошибках на русском языке в...

Замена символов в строке, содержащей текст на русском языке
Помогите, пожалуйста. Как будет выглядеть код программы на форме в c#: Дана строка символов, содержащая некоторый текст на русском языке....

15
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
14.09.2010, 17:12
Каким образом загружаете данные в dataGridView?
0
 Аватар для Terion
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
14.09.2010, 17:51
я вот такую функцию использую. 1я-кодировка, в которой текст, 2ая - в которую (обычно Encoding.Default)

C#
1
2
3
4
5
6
7
8
9
public static string Convertall(string value, Encoding src, Encoding trg)
        {
            Decoder dec = src.GetDecoder();
            byte[] ba = trg.GetBytes(value);
            int len = dec.GetCharCount(ba, 0, ba.Length);
            char[] ca = new char[len];
            dec.GetChars(ba, 0, ba.Length, ca, 0);
            return new string(ca);
        }
1
0 / 0 / 0
Регистрация: 14.09.2010
Сообщений: 4
15.09.2010, 12:52  [ТС]
Цитата Сообщение от kirill29 Посмотреть сообщение
Каким образом загружаете данные в dataGridView?
считываю построчно файл(формат Windows в FAR'e). И потом разбиваю методом String.Split на строковый массив и затем элемент этого массива отображаю в DataGridView. И в DataGridView Кириллица отображается квадратиками.

Добавлено через 2 минуты
Цитата Сообщение от Terion Посмотреть сообщение
я вот такую функцию использую. 1я-кодировка, в которой текст, 2ая - в которую (обычно Encoding.Default)

C#
1
2
3
4
5
6
7
8
9
public static string Convertall(string value, Encoding src, Encoding trg)
        {
            Decoder dec = src.GetDecoder();
            byte[] ba = trg.GetBytes(value);
            int len = dec.GetCharCount(ba, 0, ba.Length);
            char[] ca = new char[len];
            dec.GetChars(ba, 0, ba.Length, ca, 0);
            return new string(ca);
        }
спасибо). Но это немножко другое - из байтов в символы. А мне желательно, чтобы Unicode понимал и отображал в DataGridView русские буквы).
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
15.09.2010, 13:22
Цитата Сообщение от StepUppest Посмотреть сообщение
считываю построчно файл(формат Windows в FAR'e). И потом разбиваю методом String.Split на строковый массив и затем элемент этого массива отображаю в DataGridView.
Покажите этот код.
0
 Аватар для Terion
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
15.09.2010, 19:46
Цитата Сообщение от StepUppest Посмотреть сообщение
спасибо). Но это немножко другое - из байтов в символы. А мне желательно, чтобы Unicode понимал и отображал в DataGridView русские буквы).
не, это из стринга в стринг. кроме как через массив байтов вы кодировку не смените
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
16.09.2010, 08:06
Цитата Сообщение от Terion Посмотреть сообщение
я вот такую функцию использую. 1я-кодировка, в которой текст, 2ая - в которую (обычно Encoding.Default)

C#
1
2
3
4
5
6
7
8
9
public static string Convertall(string value, Encoding src, Encoding trg)
        {
            Decoder dec = src.GetDecoder();
            byte[] ba = trg.GetBytes(value);
            int len = dec.GetCharCount(ba, 0, ba.Length);
            char[] ca = new char[len];
            dec.GetChars(ba, 0, ba.Length, ca, 0);
            return new string(ca);
        }
На других форумах то же такую функцию видел
С ней можно запутаться
Дело в том, что параметр value - типа string, а string уже сам в UTF-16. Вопрос в том, как и откуда этот value получен? И возвращается тоже string, то же UTF-16. ИМХО: эта функция может сильно перепутать байты
Попробуйте сделать этой функцией какое-нибудь конвертирование, а потом обратно. И кодировки попробуйте разные. Во всех случаях все нормально?
0
0 / 0 / 0
Регистрация: 14.09.2010
Сообщений: 4
19.09.2010, 14:34  [ТС]
Цитата Сообщение от kirill29 Посмотреть сообщение
Покажите этот код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
string name_file=Program.u_args[0];
StreamReader sr= new StreamReader(name_file);
OpenFileDialog fd = new OpenFileDialog();
UnicodeEncoding ue = new UnicodeEncoding();
 
if(fd.Show()=DialogResult.OK)
  {
    string name_file=fd.FileName; 
    string line, line_out;
    line="";
    while((line=sr.ReadLine())!=null)
         {
          line_out=line;
          line_out=line_out.Trim();  
          string[] str = line_out.Split('/t');
          if(str.Length>=3)
            {
             string row1=str[1];
             string row3=str[3];
             Byte[] EncodedBytes1=ue.GetBytes(row1);
             Byte[] EncodedBytes3=ue.GetBytes(row3);
             string gotstr1=ue.GetString(EncodedBytes1);
             string gotstr3=ue.GetString(EncodedBytes3);
             dataGridView1.Row.Add(gotstr1, gotstr3);
             }
          }  
 
  }
Добавлено через 2 минуты
Цитата Сообщение от s-kvv Посмотреть сообщение
Попробуйте сделать этой функцией какое-нибудь конвертирование, а потом обратно. И кодировки попробуйте разные. Во всех случаях все нормально?
насколько понял, при преобразовании из ANSI или ASCII в любой Unicode выходит такой дефект). У меня в таком преобразовании показываются вопросики вместо русских букв.
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
20.09.2010, 06:50
Цитата Сообщение от StepUppest Посмотреть сообщение
насколько понял, при преобразовании из ANSI или ASCII в любой Unicode выходит такой дефект). У меня в таком преобразовании показываются вопросики вместо русских букв.
Нужно конвертировать не строки, а наборы байтов, а за тем уже байты в стринг, если хотите отобразить в контроле.
Если в целевом формате ести символ, представленный в источнике-кодировке, то не должно быть никаких вопросиков, иначе будут

C#
1
2
3
4
Byte[] EncodedBytes1=ue.GetBytes(row1);
Byte[] EncodedBytes3=ue.GetBytes(row3);
string gotstr1=ue.GetString(EncodedBytes1);
string gotstr3=ue.GetString(EncodedBytes3);
Что-то тут не то. Вы из строки получаете байты UTF-16, а за тем их же обратно переводите в строку.

Странно), в DataGridView не отображаются русские буквы. Вместо них вопросики). Пробовал классом UnicodeEncoding преобразовывать в UTF32 - результат тот же. Люди посоветуйте, pls. MSDN прочитал - не нашёл, в книжках порылся - результат тот же.
Заранее признателен, Степан.
C#
1
StreamReader sr= new StreamReader(name_file);
Конструктор StreamReader имеет перегрузки с аргументом Encoding, который указывает, в какой кодировке файл. По умолчанию, если память не подводит - UTF-8. Попробуйте с этим поиграть
0
0 / 0 / 0
Регистрация: 14.09.2010
Сообщений: 4
20.09.2010, 16:31  [ТС]
Цитата Сообщение от Terion Посмотреть сообщение
не, это из стринга в стринг. кроме как через массив байтов вы кодировку не смените
в том то и вопрос, как предварительно, перед перекодировкой, перевести символьную строку ANSII в массив байтов, был бы очень признателен.

Добавлено через 7 минут
Цитата Сообщение от s-kvv Посмотреть сообщение
Нужно конвертировать не строки, а наборы байтов, а за тем уже байты в стринг, если хотите отобразить в контроле
а как получить набор байтов из строки ANSI для конвертирования?
0
 Аватар для Terion
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
20.09.2010, 23:44
я что-то вас не понимаю)вы же пишете "разбиваю методом String.Split на строковый массив и затем элемент этого массива отображаю "

ну так вот у вас будет что-то типа

C#
1
dataGridView1.Rows[i].Cells[0].Value=Convertall(mas[i], ваша кодировка, Encoding.Default);

вопрос идентичности раскодированно-закодированных строк меня не сильно волновал, т.к. получаемые строки меня вполне устраивают и дают требуемые результаты при сравнении этих строк с некоторыми заданными строковыми переменными)
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
21.09.2010, 06:29
Цитата Сообщение от StepUppest Посмотреть сообщение
в том то и вопрос, как предварительно, перед перекодировкой, перевести символьную строку ANSII в массив байтов, был бы очень признателен.

Добавлено через 7 минут

а как получить набор байтов из строки ANSI для конвертирования?
По вашему коду: У вас есть файл в кодировке ANSI (это и есть набор байтов). Создаете соответствующий Encoding, создаете StreamReader с именем файла и этим Encoding. Читаете строки.
Тут конвертирование происходит где-то внутри. На выходе получаете строки, в которых все символы уже переведены из ANSI в аналоги Unicode. Используйте полученые строки. Больше ничего делать не надо.
В контролах все должно быть без вопросиков

Цитата Сообщение от Terion
вопрос идентичности раскодированно-закодированных строк меня не сильно волновал, т.к. получаемые строки меня вполне устраивают и дают требуемые результаты при сравнении этих строк с некоторыми заданными строковыми переменными)
То есть естли в целевой строке не будет нескольких символов, которые есть в источнике, вас это устроит? А скорееи больше. Английские то символы обычно без проблем, а другие нет
Ваше право использовать эту функцию. Только один вопрос. Зачем конвертировать string в другой string? Оба string'а в Unicode. Вы из юникода получаете какуюто кодировку, а потом обратно в юникод переводите? И хотите что бы там что-то новое появилось? (И появляется!) Вы это странным не находите? Подумайте над этим на досуге

Что бы не быть голословным
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    class Program
    {
        static void Main(string[] args)
        {
            string strSuorce = "asdASD фывФЫВ";
            string strOut = Convertall(strSuorce, Encoding.Unicode, Encoding.GetEncoding(866));
            string strBack = Convertall(strOut, Encoding.GetEncoding(866), Encoding.Unicode);
            Console.WriteLine("strSuorce: {0}", strSuorce);
            Console.WriteLine("strOut:    {0}", strOut);
            Console.WriteLine("strBack:   {0}", strBack);
 
            Console.ReadKey();
        }
 
        public static string Convertall(string value, Encoding src, Encoding trg)
        {
            Decoder dec = src.GetDecoder();
            byte[] ba = trg.GetBytes(value);
            int len = dec.GetCharCount(ba, 0, ba.Length);
            char[] ca = new char[len];
            dec.GetChars(ba, 0, ba.Length, ca, 0);
            return new string(ca);
        }
 
    }

Вывод не тот, который можно было бы логически предположить

То, что начальная строка коряво отображается - признак того, что ее не правильно прочитали из байтов, не с тем Encoding, конечно если со шрифтами все нормально
1
 Аватар для Terion
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
21.09.2010, 08:15
я, честно, не очень хочу сейчас вдаваться в холивары)
как я это все использую?у меня есть .дбф файл, в котором, допустим, список книг. на рус и на англ.я бы очень была бы рада считывать из дбфки уже с учетом ее кодировки, но не нашла ни единого средства, параметра, свойства, артибута,... который бы можно было указать, например, провайдеру, чтобы считать из этой дбфки. кодировка у нее 866, елси не ошибаюсь. так что пришлось выкручиваться, и искать функции, которые будут перекодировать. нашла только вот эту.когда заливаю инфо в табл, делаю reader["имя"].ToString().Trim() (приходиться тримить, тк из дбфки входить фулзайзовая строка, дописанная пробелами) и гоню этот стринг в эту функцию. для меня важно то, что в итоге получая вместо козябров "пушкин", и потом делая, например, привязку из какой-то другой таблицы с if (...cells[0].Value.Contains("пушкин")) то сцепить с "4.06.", все срабатывает. объясните мне плиз,я в работе с байтами не сильна, почему в таком случае мы получаем true, елси байты потерялись?
0
 Аватар для sCreator
39 / 39 / 2
Регистрация: 19.09.2010
Сообщений: 97
21.09.2010, 09:17
Можт так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            OpenFileDialog fd = new OpenFileDialog();
            if (fd.Show() = DialogResult.OK)
            {
                using (StreamReader sr = new StreamReader(fd.FileName, Encoding.ASCII))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string[] str = line.Trim().Split('\t');
                        if (str.Length >= 3)
                            dataGridView1.Row.Add(str[0], str[2]);
                    }
                }
            }
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
21.09.2010, 13:25
Цитата Сообщение от Terion Посмотреть сообщение
объясните мне плиз,я в работе с байтами не сильна, почему в таком случае мы получаем true, елси байты потерялись?
Если, как у вас, в string запихиваются байты dos без конвертации в utf-16, а потом этой функцией конвертируются, то (имхо) максимум что может произойти - исчезновение последнего символа, если в string запихнули нечетное количество досовских байт без конвертации. UTF-16 - двухбайтная кодировка, один байт как бы получается лишним для данной функции. Для ряда других кодировок все на много плачевнее

Вот тут возвращается длинна в символах какого-то массива байтов декодером какой-то кодировки. Для одной кодировки - одно значение, для другой - другое. Тут и урезается
C#
1
int len = dec.GetCharCount(ba, 0, ba.Length);
Цитата Сообщение от Terion;
нашла только вот эту.когда заливаю инфо в табл, делаю reader["имя"].ToString().Trim() (приходиться тримить, тк из дбфки входить фулзайзовая строка, дописанная пробелами) и гоню этот стринг в эту функцию.
т.к. строка дополняется пробелами, которые вы убираете, то для вас все работает хорошо. Та функция может обрезать только 1 байт(последний пробел) - для dos

как-то так

Добавлено через 4 минуты
Цитата Сообщение от Terion Посмотреть сообщение
я бы очень была бы рада считывать из дбфки уже с учетом ее кодировки, но не нашла ни единого средства, параметра, свойства, артибута,...
Может по этому поводу новую тему?
1
 Аватар для Terion
271 / 203 / 13
Регистрация: 18.06.2010
Сообщений: 491
21.09.2010, 15:27
Цитата Сообщение от s-kvv Посмотреть сообщение
Если, как у вас, в string запихиваются байты dos без конвертации в utf-16
вот этого я не могу осилить))принудительно я не делаю никаких конвертаций, но стринг же utf-16!конвертация происходит автоматически,нет?

Цитата Сообщение от s-kvv Посмотреть сообщение
Может по этому поводу новую тему?
ну давай создам

Добавлено через 27 минут
да, про байты из дос в ютф поняла. согласна, тут косяк

присоединяйтесь
Чтение из .dbf с заданной кодировкой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.09.2010, 15:27
Помогаю со студенческими работами здесь

Дана строка символов, содержащая некоторый текст на русском языке . Разработать программу форматирования этого текста
Дана строка символов, содержащая некоторый текст на русском языке . Разработать программу форматирования этого текста, т.е. его разбиения...

Неверное отображение символов в DataGridView
Доброго времени суток. Имеется база созданая в навикате, в ней стоит кодировка cp1251. Но когда я загружаю ее в dataGridView...

GeoTiff - примеры ее использования на языке c , желательно на русском языке
Добрый вечер. Дана курсовая с использованием библиотеки GeoTiff. Подскажите где можно прочитать про нее, и найти примеры ее использования...

Создать шуточную программу, которая при вводе имени на русском языке выдаст, как оно звучит на японском языке
Такая задача была сегодня на программировании. Создать шуточную программу, которая при вводе имени на русском языке выдаст, как оно звучит...

На русском языке или языке программирования
Опишите на русском языке или на одном из языков программирования алгоритм получения из целочисленного массива А состоящего из 30 элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru