13 / 13 / 0
Регистрация: 29.10.2009
Сообщений: 71
1

кирилица

14.05.2011, 17:47. Показов 3889. Ответов 14
Метки нет (Все метки)

компилятор g++ под ubuntu

если сделать так
C++
1
2
3
4
5
 
  char *one="asdfgыффыЁ";
  printf("%s",one); 
// вывод   asdfgыффыЁ    
значит все отлично, как то оно там куда-то конвертируется
если так
C++
1
2
3
4
  
  char symb='ы';  
  printf("%c   %d\n",symb,int(symb));
//вывод    ((�)-это крякозябра , она почему в число превратилась    )  -117

где подвох товарищи? строкой оно понимает кирилицу, а символом нет. в чем корень проблемы?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2011, 17:47
Ответы с готовыми решениями:

Кирилица (UTF8) в консоли
День добрый коллеги. Столкнулся с вводом данных под линуксом ещё и на Русском. Пересмотрел тут...

Кирилица в консоле
Собственно поставил я Pelles C и решил сразу же откомпилить програмку. Все запустилось, но при...

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

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

14
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
14.05.2011, 17:51 2
может подвох в том, что char имеет размер 1 байт, а кириллица два байта? поскольку utf-8
1
13 / 13 / 0
Регистрация: 29.10.2009
Сообщений: 71
14.05.2011, 17:56  [ТС] 3
это понятно,
а char *s
это ведь строка символов , правильно?
каждый символ 1 байт , отчего же нет проблем здесь? или там что-то такое придумано?
интересно что
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
14.05.2011, 18:03 4
русский символ-два байта

Добавлено через 40 секунд
strlen("привет")==12

Добавлено через 2 минуты
в utf-8 кодировке

Добавлено через 15 секунд
судя по примеру это не понятно
1
13 / 13 / 0
Регистрация: 29.10.2009
Сообщений: 71
14.05.2011, 18:08  [ТС] 5
почему utf, а не unicode ? это всегда g++ кодирует в utf? как он выбирает нужную кодировку? можно ли как то задать ему нужную мне кодировку?

если проделать вот так
C++
1
2
3
4
5
6
  char *s="what";
  printf("%d\n",strlen(s));
//4  
 char *s2="яwhat";
  printf("%d\n",strlen(s2));
//6
т.о. в первом случае в ansi, во втором смесь какая -то получается
значит есть какой то механизм? что это?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
14.05.2011, 18:16 6
оба случая в utf-8.
Кодировку компилятор не выбирает, она по умолчанию в линуксе.
в utf-8 английские символы занимает 1 байт(также как в анси), а на русские символы выделяется два байта.
В юникоде, на каждый символ выделяется два байта, поэтому её нет смысла использовать

Добавлено через 1 минуту
Utf-8

Добавлено через 55 секунд
во втором случае "я" занимает 2 байта. 2+4=6
1
13 / 13 / 0
Регистрация: 29.10.2009
Сообщений: 71
14.05.2011, 18:24  [ТС] 7
с этим прояснилось ясно
а кто же делает эту работу, char *s - указатель на массив символов, получается при чтении , printf, должен знать , где какой символ сколько места занимает, для корректоности перевода в символьное
как это реализовано?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
14.05.2011, 18:33 8
Цитата Сообщение от shbk Посмотреть сообщение
с этим прояснилось ясно
а кто же делает эту работу, char *s - указатель на массив символов, получается при чтении , printf, должен знать , где какой символ сколько места занимает, для корректоности перевода в символьное
как это реализовано?
русский символ виден как один символ, но если открыть hex редактор их там будет 2.
char* s это указатель на char а не на массив символов.
Символ конца строки- 0, на него и ориентируется printf()

Добавлено через 2 минуты
если перевести исходный код в кодировку CP1251 то вместо русских букв будет абра кадабра, хотя внешне будет выглядеть также как и в utf-8 (если редактор нормальный)
однако русские символы в 1251 занимают 1 байт, а консоль по умолчанию в utf8

Добавлено через 1 минуту
cat main.c | iconv -t CP1251 > main-1251.c
1
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
16.05.2011, 21:21 9
А коды латинских букв и цифр в ansi и utf-8 совпадают? Или они как-то смещены?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
16.05.2011, 21:27 10
Цитата Сообщение от Damaks Посмотреть сообщение
А коды латинских букв и цифр в ansi и utf-8 совпадают? Или они как-то смещены?
все коды ниже 128 совпадают. сюда входят цифры, буквы английского алфавита и некоторые другие символы
1
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
16.05.2011, 21:31 11
А если я пишу сетевое приложение, и вкачестве буфера использую массив обычных чаров (8 бит), а на вход поступает utf-8 символ, что будет, он займет 2 чара подряд?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
16.05.2011, 22:48 12
Цитата Сообщение от Damaks Посмотреть сообщение
А если я пишу сетевое приложение, и вкачестве буфера использую массив обычных чаров (8 бит), а на вход поступает utf-8 символ, что будет, он займет 2 чара подряд?
ну вобще нужно код глянуть.
0
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
17.05.2011, 00:07 13
Вот вам набросал код
C++
1
2
3
4
5
6
7
#define BUF_SIZE 262144
char buf[BUF_SIZE];
....
//создаем сокет, дескриптор so
...
bytes_read = recv(so, buf, BUF_SIZE, 0);
// считали до BUF_SIZE байт из сокета so в буфер buf
Вообще я посмотрел, так написаны все примеры по сокетам.
Получается пришедьший символ равномерно располагается по байтам и однозначно дешифруется. Т.е. в потоке бит можно сказать что определенные n бит точно соответствуют определенному символу.
Тогда вопрос, как их выделять оттуда? w_char, как я понял, не спасает, т.к. его размер тоже фиксирован, и если на входе будет иероглиф, то он не поместится и тоже как-то распределится по нескольким элементам массива... или я где-то неправ?
Если я прав, то получается я не могу работать с символом напрямую, а это значит что задачи обработки такого текста многократно усложняются.
Если не затруднит, не моглибы рассказать, как это всё обстоит и как выделяют и обрабатывают символы в utf-8?
0
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,232
17.05.2011, 00:51 14
В данном примере каждый char будет содержать в себе какойто символ.
В случае с английскими символами всё просто. Но, если попадётся русский символ в кодировке utf-8, а он занимает 2 байта:
к примеру мы получили слово "я123"
буква "я" займёт позицию buf[0] и buf[1]
123 соответственно buf[2],buf[3],buf[4]
Если эту строку скормить printf():
C
1
printf("%s",buf);
то на экран получим:
я123
однако strlen(buf) вернёт 5 в лучшем случае, в худшем вылетит с ошибкой.(так как обязательно нужен ноль в конце)
функция recv также вернёт 5.
Все преобразования символов будет производить printf() в соответствии с кодировкой.
А чтобы понять что символ больше 1 байта, printf сравнивает(грубо говоря) самый большой бит числа(в данном случае буква я).
Если он 1, значит символ записан больше чем в 1 байт (именно от сюда число 128, 2 в седьмой степени).
вот "шаблон" для кириллицы: 110xxxxx 10xxxxxx (взято из википедии)

Так устроен utf8.

Добавлено через 5 минут
буква я занимает 2 байта в utf8 кодировке. Более подробно:
Bash
1
echo -n "я" | hexdump -C
Добавлено через 6 минут
Если глянуть на числа в двоичном режиме, то получим:
11010001 10001111
на основе выделенных битов printf и определяет размер символа

Добавлено через 4 минуты
Bash
1
echo -n "я123" | hexdump -C
выведет:
d1 8f 31 32 33
в двоичном виде это будет так:
11010001 10001111 00110001 00110010 00110011
0
4856 / 3277 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
17.05.2011, 02:39 15
есть wchar_t

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
 
/* пример wchar_t */
int main(void)
{
    wchar_t *ws = L"абвг";
    
    setlocale(LC_ALL, "");
    wprintf(L"%ls %d %d\n", ws, iswupper(L'Г'), iswlower(L'Г'));
    return 0;
}
Код
[guest@localhost tests]$ gcc -Wall t.c -o t
[guest@localhost tests]$ ./t
абвг 1 0
[guest@localhost tests]$
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2011, 02:39

Кирилица в бд
БД не принимает кириллицу. Есть форма ввода данных, которые передаются в бд (но при вводе...

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

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

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

Из БД не извлекаеться кирилица
Начал изучение видеуроков Попова по PHP. Работаю с локальным сервером версия phpmyadmin 3.5.6. При...

qt + firebird + кирилица
Здравствуйте. Подключил программу к одной базе firebird, все работает нормально, а когда...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.