Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: char - utf-8?  (Прочитано 1985 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
char - utf-8?
« : 02 Июнь 2013, 16:28:41 »
в c++ в какой кодировке хранятся символы в char? (g++ 4.8.0, дефолт, x64)
Код: C
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int len(char *ch) {
  6.         register int i;
  7.         for(i=0; ch[i]; i++);
  8.         return i;
  9. }
  10.  
  11. int main() {
  12.         char x[20];
  13.         cin >> x;
  14.        
  15.         cout << len(x);
  16.        
  17.         return 0;
  18. }
с кириллической строкой "абв" получается 6, с "abc" - 3. x[2] (0-5) выдает символ "вопросительный знак в ромбе". в книге Шилдта написано, что используется ascii, но её размер 1 байт, а здесь один символ в 2
ЗЫ strlen выдает то-же самое
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: char - utf-8?
« Ответ #1 : 02 Июнь 2013, 16:49:30 »
char не имеет кодировки. Сейчас (во всех мало-мальски используемых системах) в С (и в С++) - это синоним числа от -128 до 127.

Это в 2-х словах. В трех словах не получится, а в 4-х - замечательнейшая книга "Код" - Чарльза Петцольда (можно найти в инете).

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
Re: char - utf-8?
« Ответ #2 : 02 Июнь 2013, 17:44:46 »
nextme,
было такое предположение, что в массив просто записывается stream. тогда терминал выдает utf-8 и появляется новый вопрос: как из uft-8 перевести в "каноничный" ASCII?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: char - utf-8?
« Ответ #3 : 02 Июнь 2013, 17:52:34 »
Очень прошу прощения, но вопрос не имеет смысла. Еще раз, не возмущайтесь, не ругайтесь, но, правда, ваш вопрос неправильно сформулирован.

Ваш вопрос абсолютно аналогичен следующему: целое число 155 кодирует какой символ?

---

Конкретика - вы получаете байты из стандартного ввода. Эти байты преобразуются в char (в С++) - в числа от -128 до 127. Как трактовать эти числа - это проблемы или стандартной библиотеки (а в С++ легко увиливают от ответа на этот вопрос) - или ваши (проблемы).

---

ЗЫ Что означает (в чем прелесть и убожество С) - это ВАШИ проблемы.

===

Перечитал, и понял, что сам бы ничего не понял, если бы не знал. Но правда - в 2-х словах ответить просто и не понятно, в 4-х - это очень много. А в 3-х не знаю, боюсь, что не возможно.
« Последнее редактирование: 02 Июнь 2013, 17:55:41 от nextme »

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Re: char - utf-8?
« Ответ #4 : 02 Июнь 2013, 18:22:51 »
nextme,
было такое предположение, что в массив просто записывается stream. тогда терминал выдает utf-8 и появляется новый вопрос: как из uft-8 перевести в "каноничный" ASCII?
Что такое каноничный ASCII? Если вам надо обрезать все юникодные символы - пожалуйста, вырезайте два байта везде, где выполняется условие
Код: C++
  1. int ch = ...;
  2. bool isNotAscii = ((ch & 0xC0) != 0x80);
  3.  

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: char - utf-8?
« Ответ #5 : 02 Июнь 2013, 18:45:16 »
Попытка в трех словах:

1. Никакое объяснение кодировки символов в трех словах не имеет смысла.

2. ASCII символы - это символы, которые кодируются числами от 0 до 127.

3. ASCII символ с кодировкой 155 не имеет смысла.

4. Число 155 (не имеющее смысла в ASCII) может иметь бесконечное количество значений в других кодировках.

5. В Латин1. Или в СП1251. Или в КОИ8Р. Или в NEXТМЕ. Последняя кодировка - это та, которая я придумал. 1 - это Я, 2 - это Ф, и так далее... Можно продолжить, зачем? Смысл в том, что ASCII - это "придуманная кодировка". Просто с ней согласились.

===

А теперь об Юникоде - ООО, ЮТФ8 - одна из гениальных идей, ЮТФ16 - Java, .Net.

Ну как нибудь потом... :)

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
Re: char - utf-8?
« Ответ #6 : 02 Июнь 2013, 18:59:32 »
разобрался, даже сконвертировал на бумажке "i" из ASCII в UTF-8 (в 2 байта). я знаю что такое кодировка, вопрос неправильно поставил. на счет "каноничный" - никак не могу отвыкнуть от мысли, что char предназначен только для ASCII. буду искать способы работы с utf-8. тема не закрыта.
кстати, на вики есть интересная табличка. собственно, откуда в ней берется значение кодируемого кода (например, для К - 041A)?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 750
    • Просмотр профиля
Re: char - utf-8?
« Ответ #7 : 02 Июнь 2013, 20:05:04 »
Я wchar_t использовал, но с ним тоже не все так просто.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
Re: char - utf-8?
« Ответ #8 : 02 Июнь 2013, 20:42:52 »
aSmile,
у меня почему-то не работает
Код: C
  1. wchar_t x[20];
  2. cin >> x;
так-же для хранения 3-5 байтных значений не подходит. хотя для кириллицы должно-быть нормально
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: char - utf-8?
« Ответ #9 : 02 Июнь 2013, 20:59:32 »
Такая ересь. Удали быстрее, пока бедный Йорик в понедельник с утра это не увидел.

(И да, это ересь!)

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 750
    • Просмотр профиля
Re: char - utf-8?
« Ответ #10 : 02 Июнь 2013, 22:05:48 »
aSmile,
у меня почему-то не работает
Код: C
  1. wchar_t x[20];
  2. cin >> x;
так-же для хранения 3-5 байтных значений не подходит. хотя для кириллицы должно-быть нормально

wcin и wcout надо использовать, если с wchar_t работаешь.
Я же говорю, с этим тоже не все так просто, и лучше почитать что-то на эту тему, например, что советует nextme.
« Последнее редактирование: 02 Июнь 2013, 22:09:18 от aSmile »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: char - utf-8?
« Ответ #11 : 03 Июнь 2013, 09:33:11 »
Маты я поскипал, осталось только это.

Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов


Пользователь решил продолжить мысль 03 Июнь 2013, 09:33:59:
Kernel ops,
Из-за таких подходов как у тебя в мире столько проблем
« Последнее редактирование: 03 Июнь 2013, 10:58:15 от Yurror »

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
Re: char - utf-8?
« Ответ #12 : 03 Июнь 2013, 09:58:31 »
Yurror,
так нет еще подхода. давайте ругать школьников за то, что они говорят, что делить на ноль нельзя.
за статью спасибо, интересная
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Andrey P

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: char - utf-8?
« Ответ #13 : 03 Июнь 2013, 10:12:25 »
:)))))

А я предупреждал, что Йорик с утра в понедельник будет злой!  :P

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1389
    • Просмотр профиля
Re: char - utf-8?
« Ответ #14 : 03 Июнь 2013, 13:30:10 »
nextme,
:2funny:
---
дочитал статью до конца. думаю что вариантом оптимального соотношения геморрой/юзабилити являются wchar_t и wcsXXX. вопрос не решен для символов, у которых кодовая точка представлена более чем двумя байтами
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

 

Страница сгенерирована за 0.128 секунд. Запросов: 24.