Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 150

Unicode

25.07.2020, 20:14. Показов 3407. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна функция которая переобразует строку, в юникод строку, что бы все символы из той строки были в юникод символы
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2020, 20:14
Ответы с готовыми решениями:

C++ и Unicode
Всем привет. Читая про кодовые точки в Java, мне стало интересно как с этим дела в C++. Т.е. для обычного ASCII мы используем char (1...

Unicode в c++
Нужно вывести в консоли символ: \ Просто так сделать это нельзя, решил использовать Unicode. Код символа в Unicode : \u005C Как...

ANSI и UNICODE
#include <iostream> #include <windows.h> using namespace std; int main(){ TCHAR j; return 0;

36
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
25.07.2020, 20:16
А начальная строка в какой кодировке? Какая конечная кодировка?
0
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 150
25.07.2020, 20:29  [ТС]
Croessmah, ну обычная utf8
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
26.07.2020, 10:49
Так utf-8 это и есть юникод. Возможно, вы хотите перевести в другое юникодное представление, utf-32, тогда посмотрите на mbstowcs
0
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 150
26.07.2020, 11:13  [ТС]
COKPOWEHEU, честно сказать, мне нудно такая же функция как и на c# encoding.unicode.getstring. То же самое мне нужно и на c++
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
27.07.2020, 09:48
Я не знаю что делает ваша encoding.unicode.getstring. Лучше опишите что хотите получить в итоге.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.07.2020, 01:04
C++
1
2
3
std::string utf8=u8"わたしにできることひとつづつ叶えたい";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring utf16=converter.from_bytes(utf8);
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
28.07.2020, 10:39
Или так:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>
 
int main(){
  setlocale(LC_ALL, "");
  char src[] = u8"わたしにできることひとつづつ叶えたい";
  wchar_t res[100];
  mbstowcs(res, src, 99);
  wprintf(L"%ls\n", res);
}
Code
1
2
3
$ gcc main.c
$ ./a.out 
わたしにできることひとつづつ叶えたい
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
28.07.2020, 10:42
Цитата Сообщение от Renji Посмотреть сообщение
std::codecvt_utf8_utf16
deprecated в C++17.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.07.2020, 11:27
Цитата Сообщение от Croessmah Посмотреть сообщение
deprecated в C++17.
На бумаге deprecated, а по факту никакой альтернативы стандартом не предложено. Так что не обращаем внимания, пользуемся дальше. Ну или можно свое навелосипедить, на сколько я помню правила преобразования utf8->utf16 достаточно простые.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
28.07.2020, 14:24
Учитывая, что utf-16 тоже многобайтная кодировка (один символ unicode кодируется одним или двумя "символами" utf-16, так же как 1-4 "символами" utf-8), боюсь, только через utf-32.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
28.07.2020, 14:56
Самое простое QString::fromUtf8, QString::toUtf8

Теперь почему: Unicode меняется, в основном добавлением новых символов. Отображаемый символ может кодироваться не только несколькими unicode-символами, но и вообще разными последовательностями. Это требует постоянной поддержки, которую можно обеспечить или за счёт обновления рантайма (.Net) или обновления динамической библиотеки (ICU). И то и другое плохо ложиться на стандартную библиотеку С++ (например, как быть, если библиотека скомпилированна в MSVC, а программа в MinGW?). Как следствие, в мире C++ легче выбрать библиотеку, которая даст отличную поддержку unicode со всем эмодзями и прочей чепухой, чем использовать огрызок из стандартной библиотеки.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.07.2020, 22:29
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Учитывая, что utf-16 тоже многобайтная кодировка (один символ unicode кодируется одним или двумя "символами" utf-16, так же как 1-4 "символами" utf-8), боюсь, только через utf-32.
Utf-32 вообще говоря, тоже многобайтовый, в том смысле что диакритические знаки можно влепить отдельным символом. Плюс, на сколько я помню, Винда отображать utf-32 не умеет. Тут уже встает вопрос на сколько полную поддержку юникода мы хотим обеспечить.
Цитата Сообщение от AlexVRud Посмотреть сообщение
Теперь почему: Unicode меняется, в основном добавлением новых символов. Отображаемый символ может кодироваться не только несколькими unicode-символами, но и вообще разными последовательностями.
Может. В теории. На практике если вы не задали явно нормализацию текста, то подобные тонкости будут проигнорированы. Причем, не только в плюсах.
Python
1
2
3
4
5
6
7
8
9
10
11
# -*- coding: utf-8 -*-
import unicodedata
 
str1=u"PHƯỢNG";
str2=u"PHƯỢNG";
str3=unicodedata.normalize("NFD",str1)
str4=unicodedata.normalize("NFD",str2)
if str1==str2:
    print u"нормализация по умолчанию работает";
if str3==str4:
    print "нормализация работает, если ее задать явно";
Perl
1
2
3
4
5
6
7
8
9
use utf8;
use Unicode::Normalize 'normalize';
 
$str1="PHƯỢNG";
$str2="PHƯỢNG";
$str3=normalize("D",$str1);
$str4=normalize("D",$str2);
print "нормализация по умолчанию работает\n" if $str1 eq $str2;
print "нормализация работает, если ее задать явно\n" if $str3 eq $str4;
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.07.2020, 10:02
Цитата Сообщение от Renji Посмотреть сообщение
Utf-32 вообще говоря, тоже многобайтовый, в том смысле что диакритические знаки можно влепить отдельным символом.
Не совсем так. Диактрический знак все же может отображаться сам по себе. Но согласен, обрабатывать их как-то надо. Стандартная библиотека, да и стандартные утилиты, считают их отдельными символами.
А то что винда не умеет отображать utf-32, так это решается стандартно: при чтении конвертируем из произвольного формата во внутренний (хоть в utf-8, хоть в utf-32, хоть в cp1251 доисторический), при выводе - обратно.
А уж какой формат использовать для внутреннего представления - зависит от задачи. Для хранения константных строк достаточно обычного utf-8 (собственно, именно поэтому в линуксах, да и вебе, переход от ASCII к юникоду прошел практически безболезненно), если нужна небольшая обработка, можно и в wchar_t. Ну а если диапазон извращений над строками велик, придется и в недра реализации залезть.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
29.07.2020, 11:11
Цитата Сообщение от Renji Посмотреть сообщение
Utf-32 вообще говоря, тоже многобайтовый
Нет, это не так. Кодировка - это лишь форма кодирования (encoding form) code-point'ов посредством одного или нескольких code-unit'ов. "Многобайтовость" означает, что для описания одного code-point может потребоваться несколько code-unit.

Не по теме:

Откуда пошел термин "многобайтовость" я не знаю, скорее всего, от кодировки UTF8, в которой code-unit представляет собой байт (точнее, октет).


В свою очередь форма кодирования может быть представлена разными схемами кодирования (encoding schemes).
Для примера, форма кодирования UTF-16 может быть представлена схемами кодирования UTF-16BE, UTF-16LE или UTF-16.
Схема UTF-16 - это либо UTF-16BE, либо UTF-16LE, в зависимости от значения initial signature. Такая схема кодирования в текстовых редакторах, обычно, обозначается как UTF16 with BOM. При этом initial signature не входит в состав текста, в отличии от UTF-16BE и UTF-16LE.

Цитата Сообщение от Renji Посмотреть сообщение
в том смысле что диакритические знаки можно влепить отдельным символом.
Так называемые вами "отдельные" символы - это coded character.
При этом Unicode явно говорит о том, что character может состоять из нескольких coded character.
Также имеются combining characters, которые комбинируются с предыдущим non-combining символом.
Но это уже не имеет никакого отношения к формам представления code-point'ов, т.е. к кодировкам.
Здесь речь идет уже о формах нормализации (normalization forms), которые и определяют как интерпретировать последовательность при наличии нескольких альтернативных представлений.
Unicode описывает четыре формы нормализации:
Normalization Form D (NFD)
Normalization Form C (NFC)
Normalization Form KD (NFKD)
Normalization Form KC (NFKC)
Если хотите, можете разобраться с ними, но это уже материал для новой статьи.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.07.2020, 13:14
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Нет, это не так. Кодировка - это лишь форма кодирования (encoding form) code-point'ов посредством одного или нескольких code-unit'ов.
Извините, это словоблудие. Если один и тот же отображаемый символ может быть представлен и как U+1EE2, и как U+004F+U+031B+U+0323, это ситуация абсолютно идентичная многобайтовым кодировкам. От того что вы это U+0323 запишите в документы как зайку на лужайке, с практической точки зрения не изменится абсолютно ничего.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.07.2020, 14:38
Renji, очевидно, имелось в виду претензия к слову "многобайтная", когда речь шла о многосимвольном хранении, когда один символ занимает несколько ячеек. Хотя формально и "многобайтная" тоже не ошибка, ведь 4 байта wchar_t это тоже "много байтов". "Многосимвольная кодировка" тоже звучит так себе, но более вменяемого термина я не знаю. Да и не вижу смысла, ведь и "многобайтная" всем понятна, пусть и не совсем точна.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.07.2020, 16:41
Если говорить проще в utf8 один символ может занимать как один байт так и несколько в зависимости от того какой это символ. Например латинский символ будет занимать одни байт, а кириллический - два, какой нибудь азиатский иероглиф или спецсимвол до 4 байт. "Плавающая" длина символа позволяет экономить память но лишает возможности быстро обращаться к тому или иному символу по индексу. Так что приходится анализировать биты в байте и по маске определять есть ли "продолжение".
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.07.2020, 20:21
Цитата Сообщение от Avazart Посмотреть сообщение
Если говорить проще в utf8 один символ может занимать как один байт так и несколько в зависимости от того какой это символ. Например латинский символ будет занимать одни байт, а кириллический - два, какой нибудь азиатский иероглиф или спецсимвол до 4 байт.
Точно также в utf16 с суррогатными парами (нам очень хотелось запихать в 16-битовую кодировку миллион символов). Точно также в utf32 с его символами-Лего, собирающимися из нескольких char32_t.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
29.07.2020, 20:52
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
"Многосимвольная кодировка" тоже звучит так себе, но более вменяемого термина я не знаю.
В Unicode это называется "sequence of one or more code units". Как-то так.
И именно UTF-32 всегда имеет только один code-unit.
UTF-8 is the UCS encoding form that assigns each UCS scalar value to an octet sequence of one to four
octets
...
UTF-16 is the UCS encoding form that assigns each UCS scalar value to a sequence of one to two unsigned 16-bit code units
...
UTF-32 (or UCS-4) is the UCS encoding form that assigns each UCS scalar value to a single unsigned 32-bit code unit
Причем заметь, нигде не используется термин "байт" или "символ".
И явно задана "ширина" code-unit'ов, что дает возможность стандартизированного кодирования на системах с невосьмибитным байтом.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
очевидно, имелось в виду претензия к слову "многобайтная"
Нет. Претензия была к тому, что кодировка не имеет ничего общего с альтернативными представлениями символа.
Задача "кодировки" дать последовательность code-point'ов. Всё. На этом она заканчивается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2020, 20:52
Помогаю со студенческими работами здесь

ANSI to Unicode
Hi all. Вопрос к экспертам :) Хочу сохранить строку текста (кириллица) в текстовый файл. Строка в ANSI, а нужно сконвертировать в...

ANSI to Unicode
Всем доброго времени суток! Есть задачка преобразовать строку в cp1251 в строку в unicode и сохранить ее в файл в кодировке unicode...

Unicode символы
Здравствуйте.Каким образом можно вывести на экран символы unicode?

Преобразование в Unicode
Как преобразовать тип Buffer ,чтобы не было ошибки: error C2664: int CEdit::GetLine(int,LPTSTR,int) const: невозможно преобразовать...

From UTF-8 to UNICODE
здравствуйте!! у меня вот какой вопрос! Как сделать преобразование UTF-8 и Unicode? во общем моя программа считывает данные с базы( база...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru