Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65

Кириллица и AnsiString

08.07.2012, 16:00. Показов 8783. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Билдером начал заниматься только сегодня, поэтому периодически натыкаюсь на какие-нибудь подводные камни и не знаю, как их обойти.
Проблема такая, у меня имеется структура, содержащая массивы Char.
Для того, чтобы вывести в поле Memo элемент структуры, необходимо привести Char к AnsiString. Перед этим нужно сравнить массив Char и забитую в поле Edit строку. Все бы ничего, но вот массивы у меня содержат строки на русском языке. И при приведении AnsiString к Char методом Text.c_str() для сравнения с исходным массивом Char в новом массиве записываются всякие гадости. Например: исходная строка "Константин" в AnsiString выглядит как "Љ®-*бв -*вЁ-*" и с точность до наоборот.

Подскажите, пожалуйста, как мне массив символов Char превратить в AnsiString и из AnsiString в Char без изменения русского слова?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2012, 16:00
Ответы с готовыми решениями:

Как перевести текст из AnsiString (в формате UTF8) в AnsiString формата Windows-1251?
Поиск по форуму не решил текущую проблему: 1. Есть текст в формате UTF-8 в величине: AnsiString qw; Вопрос: 2. Как перевести текст в...

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица)
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и посчитать количество вхождений, если...

AnsiString
НЕ могли бы сказать, почему при считывании из файла в переменную типа AnsiString компилятор выдает ошибку??? вот код: Код: ...

24
 Аватар для Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
08.07.2012, 16:24
Билдер какой версии?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2012, 18:38
char или Char ?
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 19:37  [ТС]
версия Borland C++ Builder 6. Тип char. А разве есть разница в Char и char?

P.S. Все облазил. Нашел на одном форуме только запись о том, как переводить из типа в тип и фразу "с кириллицей скорее всего будут проблемы"..
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2012, 19:43
версия Borland C++ Builder 6. Тип char. А разве есть разница в Char и char?
Builder 6 нет, в старше есть разница так как там Unicode.

Честно говоря не помню такой проблемы в Builder6. Приведите код.
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 19:53  [ТС]
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
struct student                                                                      //структура
{
     char name[20];
     char sname[20];
     char tname[20];
     char group[10];
     int course;
     int number;
     int busy;
};
int N=1, i=0;
student *T;                                                         // буфер
student *BS = new student[N];
FILE *fp;
char filename1[200]="StudentData.mydb";
//------------------------------------------------------------------------------
void clear(student *p, int n)
     {
      for (int i=0;i<n;p++,i++)
        p->busy=false;
     }  ;
//------------------------------------------------------------------------------
void loader_s(){
int n=0,b=0;
 
       fp=fopen("StudentData.mydb","rb");
        fscanf(fp,"%d\n",&N);                               // размер БД
        delete BS;
       BS=new student[N];
       clear(BS,N);     // создание БД данного размера
            for(n=N;n!=0;n--,b++)
            {
                 fscanf(fp,"%s\n",&BS[b].name);
                 fscanf(fp,"%s\n",&BS[b].sname);
                fscanf(fp,"%s\n",&BS[b].tname);
                    fscanf(fp,"%s\n",&BS[b].group);
                   fscanf(fp,"%d\n",&BS[b].course);
                fscanf(fp,"%d\n",&BS[b].number);
                   fscanf(fp,"%d\n",&BS[b].busy);
            }
         fclose(fp);                                     //закрыть
        return;
}
//---------------------------------------------------------------------------
int finder_s(){
fp=fopen("StudentData.mydb","rb");
fscanf(fp,"%d\n",&N);                              // поиск элемента
int d;
for(i=0;i<N;i++){
           d=strcmp(BS[i].name,Form1->Edit1->Text.c_str());                      // поиск совпадений
          if (d==0) {ShowMessage("Найдено"); return i; break;}
          }
if (d!=0) {ShowMessage("Не найдено"); return -1;}
}
finder_s() выводит индекс найденного совпадения. Это надо для дальнейшей работы. Так вот, функция finder_s() работает как надо только на латинице. На кириллице всегда выводит сообщение НЕ НАЙДЕНО.

C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button7Click(TObject *Sender)
{
int m;
loader_s();
m=finder_s();
if (m!=-1) Memo2->Lines->Add(AnsiString(BS[m].name));
 
}
Пробовал выводить просто AnsiString(BS[0].name), но в Memo2 пишет все ту же белеберду.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2012, 20:24
Пробуйте код
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char ch[]="Русский текст";
Memo1->Lines->Add(ch);
}
//---------------------------------------------------------------------------
Если нормально выводит - значит проблема не в Builder-е, а в кривом коде.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.07.2012, 21:17
C++
1
2
3
4
5
6
AnsiString str;
char ch[]="Русский текст";
str = strcpy(str.c_str(),ch);
// или вопче
// str = ch;
Memo1->Lines->Add(str);
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 21:32  [ТС]
Пробовал уже напрямую выводить массив. Все равно гадость выходит.

Если я задаю массив из самой программы, то получаю нормальный вывод. А если как у меня в коде сначала считываю из файла данные а потом пытаюсь их вывести..Выходит не то..
0
19 / 19 / 6
Регистрация: 09.03.2012
Сообщений: 91
08.07.2012, 21:39
а файл то как создаешь?
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 21:46  [ТС]
Отдельная консольная прога. Просто я чтоб не париться с созданием структуры данных студентов на Билдере взял старую программу написанную на Борланде. Она работает с БФ студентов и потом сохраняет в файл. Вот этот файлик я и использую потом в самом Билдере.

Код большой у консольной проги. Скину функцию сохранения в файл из нее.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void save_bd()
        {
       int n;
     fp=fopen(filename,"wb");                                 //открытие для записи
        fprintf(fp,"%d\n",N);
             for (n=0;n<N;n++)
                 {                                      //запись элементов БД в файл
                     fprintf(fp,"%s\n",BS[n].name);
                 fprintf(fp,"%s\n",BS[n].sname);
                fprintf(fp,"%s\n",BS[n].tname);
                    fprintf(fp,"%s\n",BS[n].group);
                   fprintf(fp,"%d\n",BS[n].course);
                fprintf(fp,"%d\n",BS[n].number);
                   fprintf(fp,"%d\n",BS[n].busy);
                 }
         fclose(fp);                                                           //закрытие
         return;
      }   ;
Как то так, записывает в файл с именем "StudentData.mydb"
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.07.2012, 21:52
StamSvam, покажите содержимое, или, лучшее, прикрепите файл StudentData.mydb, запущу у себя.
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 21:53  [ТС]
Есть старая прога. Консольная. Она работает со структурой данных, добавление, удаление и т.д. И сохраняет ее в файл. Вот с этим файлом я и работаю в Билдере.

Код длинный, скину только функцию сохранения в файл и структуру.

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
29
30
31
32
33
34
struct student                                                                      
{
     char name[20];
     char sname[20];
     char tname[20];
     char group[7];
     int course;
     int number;
     int busy;
};
 
student *T;                                                         // буфер
student *BS = new student[N];                            // динамический массив
FILE *fp;
char filename[200]="StudentData.mydb";
 
void save_bd()
        {
       int n;
     fp=fopen(filename,"wb");                                 //открытие для записи
        fprintf(fp,"%d\n",N);
             for (n=0;n<N;n++)
                 {                                      //запись элементов БД в файл
                     fprintf(fp,"%s\n",BS[n].name);
                 fprintf(fp,"%s\n",BS[n].sname);
                fprintf(fp,"%s\n",BS[n].tname);
                    fprintf(fp,"%s\n",BS[n].group);
                   fprintf(fp,"%d\n",BS[n].course);
                fprintf(fp,"%d\n",BS[n].number);
                   fprintf(fp,"%d\n",BS[n].busy);
                 }
         fclose(fp);                                                           //закрытие
         return;
      }   ;
Кстати, числа тоже выводит на ура. Вводил в список студентов такого парня name[]="ForeverAlone". Билдер это тоже выводит на ура. А вот русские имена не хочет и все. Косячит.
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 21:57  [ТС]
Два раза написал. Инет тупил. Прикрепляю Файлик и текст консольной проги на всякий случай.
Вложения
Тип файла: zip afqks.zip (3.6 Кб, 10 просмотров)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2012, 22:01
Пробовал уже напрямую выводить массив. Все равно гадость выходит.
Как вариант установите новый Builder...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.07.2012, 22:03
угу,
Не найдено
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.07.2012, 22:07
Но суть тут не в билдере, как показывает крутой программистский редактор, файл у вас сохраняется в кодировке DOS, судя по всему:



, т.е., для использования в билдере вам надо делать со строками махинации типа OemToAnsi().
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2012, 22:08
Ну так так иероглефы и записаны- не та кодировка
Миниатюры
Кириллица и AnsiString  
0
6 / 6 / 0
Регистрация: 08.07.2012
Сообщений: 65
08.07.2012, 22:10  [ТС]
C++
1
2
3
4
5
6
7
//====руссификатор==============================================================
void printsk (char*format)
{char buf [500];
va_list ptr;
CharToOem (format, buf); //изменение кода
va_start (ptr, format);
cprintf (buf, ptr);}
Вот такая штука стояла на консольной проге для вывода русского текста. Как я сейчас (додумавшись!) просмотрел файл в блокноте, увидел, что все русские записи хранятся там как раз в том виде, в котором выводятся в Билдере.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.07.2012, 22:11
результат OemToAnsi() :

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2012, 22:11
Помогаю со студенческими работами здесь

Не вызывается AnsiString()
Привет всем. Разбираю чужой код. Не пойму почему вызывается AnsiString() . Я в C Builder никогда не работал. Но тут...

AnsiString в WinApi
Привет знающим! у нас лабы по WinApi как раз нужны строки. есть очень хороший класс AnsiString. Но есть проблемы с его подключением,...

Из AnsiString в WORD
Здравствуйте. В Edit4-&gt;Text записывается сообщение длиной 4 символа, далее это сообщение переводим в 16 систему исчисления и делим на 2...

Тип AnsiString
Доброе время суток. Что то не получается вот это задание. В символьной строке, содержащей не более 80 символов,каждые 2 соседних слова...

Массив AnsiString**
Здравствуйте, есть вопрос: Почему при попытке удалить динамический массив AnsiString** возникает нарушение доступа, чего не случается при...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru