Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 4
1

Кирилица (UTF8) в консоли

29.03.2016, 12:29. Показов 886. Ответов 9
Метки нет (Все метки)

День добрый коллеги.
Столкнулся с вводом данных под линуксом ещё и на Русском. Пересмотрел тут кучу тем, но рецепты не помогли.
Может кто то дать рабочее решение?
Моя текущая ос - Debian 8.3 (jessie)
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
locale
LANG=ru_RU.UTF-8
LANGUAGE=ru_RU:ru
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Мой текущий код. Выпилил все проверки и нагромождения тестовых конструкции кои пробовал.

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
55
56
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
 
#define DEBUG 1
#define SDELIM "===================+++====================\n"
 
int main(int argc, char* argv) {
  setlocale(LC_ALL, "");
  wchar_t *ptrWStr, *ptrSamp, ch;
  int ichnum=0, istrlen=1, isntcnt=0, ientries=0, flag=0, icntwrds=0, ifwstp=0,icntout=0;
  int icntsnts[100];
  ptrSamp = malloc(sizeof(wchar_t));
  ptrWStr = malloc(sizeof(wchar_t));
  printf("Enter string to parse:" );
  //Check pointers
#ifdef DEBUG
  puts(SDELIM);
  printf("Current pointer to string: %p, CurentPointer to Sample:%p \n",ptrWStr,ptrSamp);
  puts(SDELIM);
#endif
  while ( (ch =fgetwc(stdin)) != '\n' ) {
    //ch = fgetwc(stdin);
    ptrWStr = realloc(ptrWStr,istrlen*sizeof(wchar_t));
    if ( ((ch == '.') || (ch == '!') || (ch == '?') ) ) {
     isntcnt++;
     icntsnts[icntwrds]=ichnum;
    }
    if ( (isspace(ch) || ispunct(ch)) && !(ifwstp) ) {
     ifwstp=ichnum;
    }
//    ptrWStr[ichnum] = ch;
    *(ptrWStr+ichnum)=ch;
    ichnum++;
    istrlen++;
  }
  ptrWStr[ichnum] = '\0';
 
#ifdef DEBUG
  puts(SDELIM);
  //setlocale(LC_ALL, "rus");
  fputws(ptrWStr,stdout);
  printf("Sentences: %i, First word ends: %i \n", isntcnt,ifwstp);
  //for (icntout=0; icntout<ichnum; icntout++){
//    putwchar( *(ptrWStr+icntout));
 // }
  puts(SDELIM);
#endif
 
 
 
 // free(ptrWStr);
 // free(ptrSamp);
  return 0;
}
Вот результат:
Bash
1
2
3
4
5
6
7
8
9
10
Enter string to parse:===================+++====================
 
Current pointer to string: 0x9011840, CurentPointer to Sample:0x9011830
===================+++====================
 
Нет. Вообще .
===================+++====================
   <<- Вот Тут должна быть строка введёная мной ->>
Sentences: 2, First word ends: 4
===================+++====================
Причём после какого-то символа нажатие enter не отлавливается.
Может кто-нибудь прояснить как это побороть?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2016, 12:29
Ответы с готовыми решениями:

Кирилица в консоли
С CSharp перешол на C++, начал с азов создаю консольное приложение, без ошибок все отлично, но...

Кирилица в консоли
Вместо русских символов - квадратики. Пробовал искать, как исправить эту проблему, но зашел в...

Кирилица
И не вздумайте посылать на Google задача такая, нужно в консольном приложении Qt осуществить:...

Кирилица
В запросах при написании на русском выводит знаки вопроса. select 'Например' выведет ?????? Как...

9
6 / 4 / 1
Регистрация: 05.01.2013
Сообщений: 45
29.03.2016, 18:55 2
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
int i = 0;
115 char * buffer = NULL;
116 char   chr[1];
117 char * tmp = NULL;
118 buffer = malloc(1);
119     if(buffer != NULL){
120         while(1){
121 
122             fread(chr,1,1,stdin);
123 
124                if(chr[0] == '\n'){
125                  buffer[i] = 0; // terminate line
126                  break;
127 
128                }
129 
130             buffer[i] = chr[0];
131             tmp = realloc(buffer,i+2);
132 
133             if(!tmp){
134               printf("realloc error \n");
135               break;
136             }
137 
138             buffer = tmp;
139             i++;
140         }
141       printf("%s\n",buffer);
142       free(buffer);
143 
144     }
145    else{
146      printf("malloc error \n");
147    }
Этот код читает и выводит как русские так и латинские буквы в suse 13.2. Если у Вас он так же ничего не выведет, значит дело в каких-то настройках
1
464 / 325 / 107
Регистрация: 02.10.2008
Сообщений: 1,298
Записей в блоге: 1
29.03.2016, 19:16 3
Цитата Сообщение от SterhTG Посмотреть сообщение
C
1
setlocale(LC_ALL, "");
А почему пустая строка, а не "Russian"?
0
6 / 4 / 1
Регистрация: 05.01.2013
Сообщений: 45
29.03.2016, 20:37 4
Засада с wchar. Если переключить раскладку на русскую, то перестаёт воспринимать ' \n', получается бесконечный цикл.
0
464 / 325 / 107
Регистрация: 02.10.2008
Сообщений: 1,298
Записей в блоге: 1
29.03.2016, 22:14 5
Цитата Сообщение от Whyte Посмотреть сообщение
Если переключить раскладку на русскую, то перестаёт воспринимать ' \n', получается бесконечный цикл.
А если так
C
1
L"\n"
?
0
6 / 4 / 1
Регистрация: 05.01.2013
Сообщений: 45
29.03.2016, 23:35 6
вы наверное хотели сказать....
C
1
L'\n'
?
0
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 4
30.03.2016, 12:00  [ТС] 7
Whyte, Ваш код работает, но появляется лишний символ.
Нет. Вообще .
Нет. Вообще ▒.
Это облегчает мне задачу, но откуда этот символ?
drfaust, а что делает L'\n' ? Откуда литерал L ? Что он делает можете пояснить?

Цитата Сообщение от drfaust Посмотреть сообщение
А почему пустая строка, а не "Russian"?
Пустая строка заставляет функцию брать значение из переменных окружения.
Если вставить строку Russian затем сравнивать с L'\n' или '\n' ввод новой строки не отлавливается.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
30.03.2016, 13:01 8
Цитата Сообщение от SterhTG Посмотреть сообщение
Мой текущий код. Выпилил все проверки и нагромождения тестовых конструкции кои пробовал.
Это всё особенности работы с локализованными UNICODE строками в char и wchar_t представлениях:
- нужно работать только или с одним, или с другим...
- в поток SYSOUT можно выводить либо char, ибо wchar_t, но не вперемешку (без переинициализации SYSOUT)

Подробности можете см. локализация строк в C-коде

Добавлено через 3 минуты
Цитата Сообщение от SterhTG Посмотреть сообщение
а что делает L'\n' ? Откуда литерал L ? Что он делает можете пояснить?
L"..." или L'...' - это указание на то, что далее следует литеральное выражение в представлении wchar_t, в Linux это: UTF-32, int32t ... - 32 бит представление на каждый UNICODE символ.
1
464 / 325 / 107
Регистрация: 02.10.2008
Сообщений: 1,298
Записей в блоге: 1
30.03.2016, 18:53 9
Цитата Сообщение от Whyte Посмотреть сообщение
вы наверное хотели сказать....
Сорри - очепятался. Именно символ L'\n' , а не строка.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
31.03.2016, 12:58 10
Цитата Сообщение от SterhTG Посмотреть сообщение
Может кто-нибудь прояснить как это побороть?
Нельзя смешивать в поток STDOUT вывод char и wchar_t: или одно, или другое.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2016, 12:58

Кирилица
Ввожу в форме файла html строку на русском языке, она отправляется на сервер (через AJAX) и...

Кирилица
Всем привет, мы в универе работаем на IDE Dev-cpp, и вопрос такой, он не распознает кириллицу...

кирилица
Весь русский текст на сайте выводится не правильно и вовсе каким то бредом. Сам файл перекодирывал...

кирилица
компилятор g++ под ubuntu если сделать так char *one=&quot;asdfgыффыЁ&quot;; printf(&quot;%s&quot;,one); ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru