Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701

Откуда компилятор знает по какой таблице он должен раскодировать букву?

10.11.2021, 08:30. Показов 4496. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ASCII он должен использовать или UTF8? Или UTF16, и.т.п.

Например пишу я это wchar_t a=L'ж';
Как компилятор узнает по какой таблице он должен раскодировать данный символ?
---------------------
И ещё вопрос по размеру символов разных кодировок.
ANSI и ASCII по 1 Байт?
UTF8 и UTF16 от 2 до 4 Байт?
---------------------
Почему вопрос возник у меня этот.
Code Blocks не понимал кириллицу, но потом как то сам автоматически что то у себя переставил, вылезло оповещение что то связанное с UTF8 и потом всё заработало. Не знаю что за настройки изменились в Code Blocks.

Может можно в коде задать напрямую то, в какой системе должны раскодироваться символы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2021, 08:30
Ответы с готовыми решениями:

Откуда программа знает какой использовать метод?
От куда программа знает какой использовать метод: public static ThreeD operator +(ThreeD op1, ThreeD op2) { ...

Пример из книги Сандерсона: Откуда метод ninjectKernel.Get знает какой контроллер возвращать
Всем привет! Читаю книгу Сандерсона про ASP.NET MVC3 (стр.151). В связи с этим попрошу разъяснить мне один пример. Сразу скажу, что все...

Кто знает подскажите как раскодировать сие чудо
Доброго времени суток уважаемые жители форума нашел на форуме тему с моей проблемой но на пол пути сел как говорят в лужу. Во общем суть...

54
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
11.11.2021, 23:49
Студворк — интернет-сервис помощи студентам
Байты массива выведите по отдельности.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
12.11.2021, 04:12  [ТС]
strcat(arr, arr2); В этом случае не работает.
С данным типом char32_t наверное strcat не функционирует.

Добавлено через 8 минут
Видимо это тупиковый путь пользоваться этими типами char32_t.
Не поддерживаются функциями они или я неправильно ими пользуюсь.

Как 32 Битную поддержку организовать?
Так не получается: char *a = u32"Жи-ши";

Добавлено через 6 минут
Блин. UTF8 до 4 Байт ведь. Куда ещё больше надо.

Добавлено через 2 минуты
С char32_t конечно облом.
Тип данных создали, но он нигде не работает.

Добавлено через 1 час 39 минут
В этой системе:
*a = u8"Ж";
чтоб один символ массива взять нужно дополнительные лишние действия производить.
Посимвольно непонятно как сохранять.
---------
wchar_t идеальный тип, был бы такой же ещё, но для 32 бита ещё, тогда больше ничего и не надо было бы.
В начале кода пишем: setlocale(LC_ALL, "Russian");
Перед символом нужную букву кодировки
C
1
2
3
wchar_t a = u'Ж';
wchar_t a = U'Ж';
wchar_t a = L'Ж';
И в printf("%lc\n",a); указать спецификатор %lc или %ls если это массив.

Плюс бонусом wchar_t[10]; каждый элемент массива принимает размер нужного типа данных. В данном случае 2 Байта.
Сказка.
-----------------
*a = u8"Ж";
Здесь сохранили массив и теперь надо как то выковыривать из него символы по 2 Байта))

Добавлено через 42 минуты
Весь Юникод может храниться в двух Байтах, это до числа 65535 http://foxtools.ru/Unicode
Так что мне ещё надо. Двух Байт разве не хватит?
-------------------
Но правда удобная система char a[10] = u8"Ж";
Не важно какого языка символ, он закодируется.
Но работать с символами, элементами массива, когда они не имеют размеров типа символа...

Добавлено через 1 час 31 минуту
Аа, это Юникод до 2х Байт, а в UTF8 наверное те же самые символы в большее количество байт сохраняются.
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
12.11.2021, 07:13
koeltrad, всё не так. Начните изучать с начала.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
12.11.2021, 08:16  [ТС]
Хотя так не получается:
SetConsoleOutputCP(CP_UTF8);
char *a2 = u8"휸";
Ничего не выводит.

HEX код у этого символа 34d738

Добавлено через 58 минут
Кстати вот как пееводить из Юникода в UTF8.
1. Нужно определить нужное количество октетов для кодирования символа.
На википедии хорошая таблица есть под названием: https://ru.m.wikipedia.org/wiki/UTF-8 Диапазон номеров символов. Требуемое количество октетов.
Кароче после HEX 7F требуется два октета.

Имеем символ 'Ж', HEX код этого символа в Юникоде == 0416. Десятичный код символа в Юникоде ==1046.
Двоичный вид - для символа 'Ж' это получится 10000010110
https://i.voenmeh.ru/kafi5/Kam... /UTF-8.htm

Теперь надо разделить этот 10000010110 двоичный код на две части.
Остчитываем 6 бит с конца, делим и получаем 10000 010110

2. Установить старшие биты первого октета в соответствии с необходимым количеством октетов.
Для кодирования символа 'Ж' нужно два октета. Поэтому устанавливаем в начале первого октета 110xxxxx
А в начале второго октета 10xxxxxx
В итоге получаем: (110)10000 (10)010110
Убираем скобки и переводим в HEX: 1101000010010110==D096
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
12.11.2021, 08:28
Цитата Сообщение от koeltrad Посмотреть сообщение
Ничего не выводит.

В шрифте нет рисунка для этого символа.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
12.11.2021, 10:00  [ТС]
Можете написать хоть один символ в 3 Байта, который отображается в Visual Studio например?
Пытаюсь разобраться что произойдёт если в массиве окажутся символы с разным размером.
char *a2 = u8"Жи-ши휸휸휸휸휸휸휸";
https://www.vssoft.bg/unicode-... d-symbols/
Не сохраняются, не отображаются.

Добавлено через 53 минуты
С однобайтовым и двухбайтовым символом проверил.
char* a2 = u8"fЖ";
Все они сохраняются нормально.
Непонятно только как определять границы символов.
В char массиве понятно что каждый следующий байт это следующий символ. А здесь как?
И как вывести в printf нужный Байт из такого массива?
Или сохранить нужный символ из массива в другую переменную?
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
12.11.2021, 10:41
Непонятно только как определять границы символов.
Алгоритм декодирования utf-8 подскажет, сколько байт на символ идёт.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
12.11.2021, 11:04  [ТС]
Сложно, неудобно.

Добавлено через 2 минуты
Не хватает неявного преобразования массива в тип UTF8 с фиксированным размером каждого элемента массива в 4 Байта.

Добавлено через 2 минуты
Это чтоб элемент массива сейчас скопировать и вывести надо сначала memcpy использовать, перед этим надо знать размеры всех символов в массиве. ппц.
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
12.11.2021, 11:13
Ну а вас кто-то заставляет это использовать? Вам зачем вообще юникод?

Добавлено через 2 минуты
Цитата Сообщение от koeltrad Посмотреть сообщение
Не хватает неявного преобразования массива в тип UTF8 с фиксированным размером каждого элемента массива в 4 Байта.
Это не нужно. Преобразование между кодировками - другой вопрос.

Цитата Сообщение от koeltrad Посмотреть сообщение
Это чтоб элемент массива сейчас скопировать и вывести надо сначала memcpy использовать,
Так не делают, оно не нужно.

Всё уже украдено написано до вас: https://github.com/sheredom/utf8.h
1
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
12.11.2021, 11:29  [ТС]
Не понял. А зачем использовать копии уже существующих функций для UTF8?
Вот например strcat всё работает без сторонних функций.
C
1
2
3
4
 char arr[20] =u8"Жи-ши";
 char *arr2 = u8" Кириллица";
 strcat(arr,arr2);
 printf("%s\n", arr);
Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
Ну а вас кто-то заставляет это использовать? Вам зачем вообще юникод?
Хочу знать эту область языка Си тоже.

Добавлено через 3 минуты
А, ок. strncpy помогла бы.
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
12.11.2021, 11:48
strcat работает благодаря тому, что строка utf-8 всё ещё является null-terminated string.
Функции переписаны затем, что символы здесь - не фиксированной длины.

Это вообще не область C.

Добавлено через 7 минут
Вот тут этим занимаются : https://icu.unicode.org/

Добавлено через 10 минут
Цитата Сообщение от koeltrad Посмотреть сообщение
Можете написать хоть один символ в 3 Байта, который отображается в Visual Studio например?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <windows.h>
#include <stdio.h>
 
int main() {
    const wchar_t* caption =
        L"\U0001F631";  // U+1F631 FACE SCREAMING IN FEAR
    const wchar_t* message =
        L"\U0001F648"   // U+1F648 SEE-NO-EVIL MONKEY
        L"\U0001F649"   // U+1F649 HEAR-NO-EVIL MONKEY
        L"\U0001F64A";  // U+1F64A SPEAK-NO-EVIL MONKEY
    MessageBoxW(NULL, message, caption, MB_OK);
    int a = strlen(caption); // == 4
 
}
Источник: http://www.open-std.org/jtc1/s... /n2231.htm
1
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
13.11.2021, 04:03  [ТС]
HEX код в этих трёх вариантах остаётся одним и тем же.
Все три варианта закодированы в Юникоде. В данном случае 0416
Не в utf8, ascii или utf16, а именно в Unicode.
C
1
2
3
wchar_t a = u'Ж';
wchar_t a = U'Ж';
wchar_t a = L'Ж';
-------------------------------------------
В этих двух вариантах например HEX код меняется.
Первый в ASCII, второй в UTF8 кодируется.
C
1
2
char* a2 = "Ж";
char* a2 = u8"Ж";
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
13.11.2021, 05:57
koeltrad, зачем вы усложняете? Вся кириллица умещается в 1 байт, а вы пытаетесь запихнуть в 2 байта, это же не разумно.
0
11 / 7 / 4
Регистрация: 29.07.2019
Сообщений: 701
13.11.2021, 06:34  [ТС]
То есть в итоге так сохранить будет достаточно? unsigned char a = 'Ж';
char до 127
unsigned char до 255
А это setlocale(LC_ALL, "Russian"); нужно только для того чтоб в консоле кириллица распознавалась?

Добавлено через 1 минуту
А точнее чтоб Юникод в консоле распознавался как кириллица.
Потому что это wchar_t a = L'Ж'; конвертируется в Юникод.
А Юникод до двух Байт. Поэтому тип переменной wchar_t

Добавлено через 5 минут
---
0
Эксперт .NET
 Аватар для Rius
13831 / 7873 / 1705
Регистрация: 25.05.2015
Сообщений: 23,913
Записей в блоге: 14
13.11.2021, 11:09
koeltrad, нет, однобайтовые национальные кодировки должны вымереть, слишком много проблем они создали. Сейчас надо использовать Unicode. Самый популярный - utf-8.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2021, 11:09

Hello world откуда знает о событии
Добрый день! Только сел изучать WinAPI Написал Hello world и сел комментировать, чтоб запомнить, что за что отвечает Код наверное все...

Откуда программа знает это значение?
#include &lt;iostream&gt; using namespace std; void HoursMin (int); int a, b; int main() { cout &lt;&lt; &quot;Enter the number of...

Компилятор не знает dirent.h
Как это исправить?

Компилятор не знает тип ushort
Здравствуйте. Увидел тип ushort в учебнике,сперва не понял,что за тип такой,но потом узнал,что это просто сокращённый вариант unsigned...

Свет светит не оттуда откуда должен
Делаю следующее - в центре системы координат шар. Наблюдатель в координатах 10, 10, 10. Смотрит в начало координат. Ставлю свет тоже в...


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

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru