Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480

Wchar_t и unsigned wchar_t в windows

04.04.2016, 12:13. Показов 3773. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Печально, но факт:
wchar_t - 2 байта,
unsigned wchar_t - 4 байта

Вопрос1: используется ли unsigned wchar_t для хранения UNICODE-символов d windows?, и если да то..
Вопрос2: как будут размещаться байты при конвертировании char ('1') в unsigned wchar_t (00 00 00 31)?
Вопрос3: Почему эти 2 типа так отличаются?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2016, 12:13
Ответы с готовыми решениями:

Почему const wchar_t* воспринимается как wchar_t* ?
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir); и такая ошибка появляется : ...

Cannot convert from 'wchar_t' to 'const wchar_t *'
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L"abvgdee...

Error C2664: невозможно преобразовать из "wchar_t" в "const wchar_t *"
Вот так работает: wchar_t buf; Edit_GetText(hE, buf, sizeof(buf)); if(buf) { wchar_t b; _itow_s(wcscspn(buf, &buf), b, 10); ...

22
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.04.2016, 13:33
Цитата Сообщение от Serg_o_Grey Посмотреть сообщение
unsigned wchar_t
В стандарте wchar_t не может быть signed/unsigned.
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
04.04.2016, 15:40  [ТС]
avgoor, в стандарте может и нет, а у меня на Dev-C++ на винде позволяет так делать
и функция typeid(unsigned wchar_t).name() из <typeinfo> возвращает 'j', что аналогично unsigned int

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <typeinfo>
 
using namespace std; 
 
int main(int argc, char** argv) 
{
    cout << typeid(unsigned wchar_t).name() << endl;
    cout << typeid(unsigned int).name() << endl;
    return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.04.2016, 15:59
Цитата Сообщение от Serg_o_Grey Посмотреть сообщение
Вопрос1: используется ли unsigned wchar_t для хранения UNICODE-символов d windows?, и если да то..
Вопрос2: как будут размещаться байты при конвертировании char ('1') в unsigned wchar_t (00 00 00 31)?
Вопрос3: Почему эти 2 типа так отличаются?
1) unsigned wchar_t не используется для хранения UNICODE, т.к. нет никакого unsigned wchar_t.
Гарантируется, что wchar_t может содержать в себе самый широкий символ платформы. wchar_t используется для хранения символов и для арифметики он не предназначен, по этому он и не бывает знаковым/беззнаковым. (кстати, надеюсь, помните, что signed char, unsigned char и char - три разных типа из которых char предназначен для строковых операций, и про него нельзя сказать - знаковый он или нет).
2) Зависит от платформы. на x86 - wchar_t(0x00ff) в памяти разместится как {0xff, 0x00}
3) См п.1 - для гих ничего не гарантируется.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
28.10.2021, 18:51
Цитата Сообщение от avgoor Посмотреть сообщение
Гарантируется, что wchar_t может содержать в себе самый широкий символ платформы. wchar_t используется для хранения символов и для арифметики он не предназначен, по этому он и не бывает знаковым/беззнаковым.
Но ведь можно привести wchar_t к int или unsigned int ? К примеру мне нужнг проверить, как символ находится в wchar_t:

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::wstring my_wstring_utf16 = L"ZЛ赤小木";
 
 
 
    if ((int)my_wstring_utf16[0] <= 127)
    {
        std::cout << "Ascii symv" << std::endl;
    }
    else
    {
        std::cout << "not Ascii symv" << std::endl;
    }

[QUOTE=avgoor;8977414]
... и для арифметики он не предназначен...
[CPP]

Что в данном случае означает для арифметики не предназначен ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,226
28.10.2021, 19:07
Цитата Сообщение от Serg_o_Grey Посмотреть сообщение
а у меня на Dev-C++ на винде позволяет так делать
Это совершенно не важно, что он там "позволяет" вам делать. Ни в С, ни в С++ не существует никакого unsigned wchar_t.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:26
TheCalligrapher, да, но :

wchar_t Тип является определяемым реализацией типом расширенных символов. в компиляторе майкрософт он представляет 16-разрядный символ, используемый для хранения юникода в кодировке UTF-16le, собственный тип символов в операционных системах Windows. версии расширенных символов функций библиотеки универсальной среды выполнения C (UCRT) используют wchar_t и его указатели и типы массивов в качестве параметров и возвращаемых значений, как и версии расширенных символов собственного API Windows.
Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
wchar_t Тип является определяемым реализацией типом расширенных символов
с упором на первую строку.
Ни разу не видел в спецификациях С++ что то про wchar_t

Добавлено через 9 минут
C++
1
2
3
    wchar_t wch = 'z';
    unsigned wchar_t uwch = 'z'; // error   ‘unsigned’ specified with ‘typeof’ 
    unsigned unsigned char uch = 3; //error   duplicate ‘unsigned’
та же ошибка, вид сбоку,
разница лишь в способе обнаружения ошибки, имхо, но это не точно, так говорит мне разбавленная интуиция.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:28
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ни разу не видел в спецификациях С++ что то про wchar_t
http://eel.is/c++draft/basic.fundamental#8

Я вот понять не могу, откуда эта тяга делать заявления по поводу вещей, в которых вы (не вы конкретно, а все те, кто так делает) не уверены\плохо разбираетесь? При всей-то полноте доступной информации, до которой добраться можно буквально в два клика.
Зачем писать "я думаю, что wchar_t вообще не стандартный тип", если вы перед этим легко можете проверить, правильно вы думаете или нет? Я правда искренне этого не понимаю.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:32
Цитата Сообщение от avgoor Посмотреть сообщение
В стандарте wchar_t не может быть signed/unsigned.
в каком стандарте ? без ссылок лучше не применять такое сильное слово как "стандарт", он же не ваш, а значит нужны ссылки.

Добавлено через 1 минуту
DrOffset, потому что по этому "стандартному" типу далеко не четкая документация по тому же cppreferrence
а читать изначальные спецификации С++ в силах не каждый, да и в 99% случаев там просто филологический мусор,
не нужный на практике.

Добавлено через 1 минуту
Type wchar_­t is a distinct type that has an implementation-defined
я тоже самое процитировал, только с колокольни MSWin

Добавлено через 32 секунды
DrOffset, я не пойму почему наезд на меня, если не правы все ваышестоящие
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:33
Цитата Сообщение от SmallEvil Посмотреть сообщение
потому что по этому "стандартному" типу далеко не четкая документация по тому же cppreferrence
а читать изначальные спецификации С++ в силах не каждый, да и в 99% случаев там просто филологический мусор,
не нужный на практике.
Если не в силах, то и заявления делать не стоит, я полагаю.
А тип таки стандартный без всяких кавычек, и моя ссылка на "изначальную" спецификацию это прямо подтверждает.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:34
Цитата Сообщение от DrOffset Посмотреть сообщение
"я думаю, что wchar_t вообще не стандартный тип"
я такого не писал, я лишь говорю что неоднозначный тип (пущенный под реализацию) не может быть стандартом.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:34
Цитата Сообщение от SmallEvil Посмотреть сообщение
я не пойму почему наезд на меня, если не правы все ваышестоящие
Это TheCalligrapher не прав? В чем именно?
Еще более вышестоящих я даже обсуждать не буду, потому что это старые посты и не факт, что это люди вообще есть на форуме до сих пор.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:38
И теми же строками на которые вы ссылаетесь Комиссия про стандартизацию С++ снимает с себя отвественность за этот тип, неявно убирая его из стандарта

Добавлено через 1 минуту
и вообще STL не является стандартом С++, о чем вы вообще ?

Добавлено через 43 секунды
size_t тоже не стандартный тип

Добавлено через 31 секунду
не встроенный
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:43
Цитата Сообщение от SmallEvil Посмотреть сообщение
я лишь говорю что неоднозначный тип (пущенный под реализацию) не может быть стандартом.
Там такая же абсолютно пущенная под реализацию текстовка написана и про char.
http://eel.is/c++draft/basic.t... damental-7
Type char is a distinct type that has an implementation-defined choice of “signed char” or “unsigned char” as its underlying type.
http://eel.is/c++draft/basic.t... damental-8
Type wchar_­t is a distinct type that has an implementation-defined signed or unsigned integer type as its underlying type.
Т.е. и char по-вашему "не может быть стандартом". Так?

Добавлено через 5 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
и вообще STL не является стандартом С++, о чем вы вообще ?
Какой STL? Где про STL вообще речь шла?

Цитата Сообщение от SmallEvil Посмотреть сообщение
Добавлено через 43 секунды
size_t тоже не стандартный тип
Добавлено через 31 секунду
не встроенный
Это, знаете, очень удобно. Самостоятельно придумывать терминологию и потом по ней делать выводы.

Стандартный - значит описанный в стандарте.
Не нужно ничего выдумывать. Если нечто в стандарте описано как implementation-defined, значит стандарт определяет это как imlementation-defined. И это определение как imlementation-defined является стандартным, именно по этой причине. И если вам говорят, что нечто является стандартным, это означает, что открыв этот самый стандарт вы найдете там описание этого нечта.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:45
Про стандарты это извечная тема во всех областях бытия.
В программистах почти всегда можно сойтись на более точных терминах.
Как я уточнил, есть встроенные типы и все остальные, называемые пользовательскими.
Нам точно нужно в это углубляться ?

А про
Цитата Сообщение от DrOffset Посмотреть сообщение
Это TheCalligrapher не прав? В чем именно?
Он не может быть участником диалога ни в каком виде. Потому что он считает что всегда прав.
Поэтому пусть себе так дальше и думает.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:46
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому что он считает что всегда прав.
В данном случае он действительно прав.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:48
DrOffset;15806204"]И если вам говорят, что нечто является стандартным, это означает, что открыв этот самый стандарт вы найдете там описание этого нечта.[/quote]
http://eel.is/c++draft вот это кстати не про стандарты, это просто описание проекта.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 19:51
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как я уточнил, есть встроенные типы и все остальные, называемые пользовательскими.
wchar_t встроенный тип, потому что описан в разделе basic.fundamental.
Если некий компилятор делает его через алиас, значит он просто нарушает спецификацию.
При этом сам факт такого нарушения никак не влияет ни на встроенность wchar_t в частности, ни на его стандартность в целом.

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
вот это кстати не про стандарты, это просто описание проекта.
У меня есть купленный за деньги не черновик, а оригинал от ISO\IEC. В том числе есть ранние версии вообще в бумаге. И там в этом аспекте все тоже самое.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2021, 19:55
Цитата Сообщение от DrOffset Посмотреть сообщение
И там в этом аспекте все тоже самое.
Я в этом не сомневаюсь, но наверное только я один (такой одаренный "тугодум") умею читать всю эту мишуру не как закон, а как правила.
И с моим подходом и легче и программировать и жить.
Не знаю чем для вас встроенный алиас отличается от рчуного, но видимо он медом помазан, и стандарт видно тоже.
Что бы закрывать глаза на обычную логику.
Тема закрыта.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.10.2021, 20:07
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не знаю чем для вас встроенный алиас отличается от рчуного, но видимо он медом помазан, и стандарт видно тоже.
Это вообще никакой не алиас.
Прямым текстом написано - отдельный тип, distinct type именно так и переводится, если что.

Выделение красным - мое.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Что бы закрывать глаза на обычную логику.
Нет никакой логики в том, чтобы называть белое черным
Вам по какой-то причине просто кажется, что так правильнее. С логикой это ничего общего не имеет. Чистый субъективизм.
У нас есть формальная система, и в рамках нее мы можем рассуждать. Она может нам нравится или не нравится, но прикрывать свои личные предпочтения логикой - абсурдно.
И вы так и не ответили, почему в вашей "логике" char выглядит нормально, а wchar_t уже какой-то не такой? При том, что для них введены совершенно идентичные правила.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2021, 20:07
Помогаю со студенческими работами здесь

CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)
Помогите разобраться с кодировками. Получаю из базы данных значения и при выводи их в EditControl все отлично, но если выводить данные в...

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'|
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция такая: std::string StripXML ...

Wchar_t
подключаюсь к серверу. Присваиваю переменной типа string имя, const char* charName = _Name.c_str(); затем в цикле передаю серверу имя...

wchar_t
что ето за тип данних: wchar_t скок у нему байт??

wchar_t to LPCWSTR
Ругается, что text является неинициализированной локальной переменной #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru