Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2014, 00:01   #1
HelloUser
Новичок
Джуниор
 
Регистрация: 18.05.2014
Сообщений: 2
По умолчанию Строки в C++, отличие char* и wchar_t*

Объясните кто-то - чем отличаются строки char* и wchar_t* ? Из прочитанного вроде ясно следующее:
1)wchar_t* - это вроде как Unicode строка (sizeof(wchar_t) выдает 2 байта на символ) - этот тип строки "хавает" символы любого алфавита.
2)а вот char* - это что за строка (sizeof(char) выдает 1 байт на символ)? Multi-Byte строка что ли? В таком случае выходи тоже юникод, тогда какой - UTF7 или UTF8? Или же это вобще ASCII строка?
Но вот в VS в настройках проекта есть опция Character Set - которая меняет представление строк с Unicode на Multi-Byte - но каких строк, если wchar_t* и char* - это уже какие-то типы строк (вопросы в пунктах 1 и 2)?

p.s. Если не сложно - могли бы привести аналогию со строками в Delphi, что бы легче понимать.
HelloUser вне форума Ответить с цитированием
Старый 19.05.2014, 01:17   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

wchar_t в винде - это подмножество уникода UCS-2 (с фиксированной длинной символов)
wchar_t в unix - это utf-32 и занимает соответственно 4 байта
в обычном чаре может быть как однобайтовая, так и мультибайтовая кодировка (utf-8)

Но вот в VS в настройках проекта есть опция Character Set - которая меняет представление строк с Unicode на Multi-Byte - но каких строк, если wchar_t* и char* - это уже какие-то типы строк (вопросы в пунктах 1 и 2)?

эта настройка в основном для WinAPI и оберток TCHAR, LPCTSTR etc
Rififi вне форума Ответить с цитированием
Старый 19.05.2014, 01:39   #3
HelloUser
Новичок
Джуниор
 
Регистрация: 18.05.2014
Сообщений: 2
По умолчанию

Т.е. выходит, и wchar_t*, и char* - это юникод строки, только первый тип имеет фиксированный размер символов (в win это 2 байта (utf-16), а в unix - 4 байта(utf-32), так что ли?), а второй тип может представлять строки с размером символов от 1 до 4 байт (utf-7, utf-8 и набор ASCII, так что ли?). Верно или что-то снова напутал?
Но а как тогда utf-32 строка представлена в win, если wchar_t* - это utf-16 выходит (ведь 2 байта)? Или wchar_t* может быть как utf-16, так и utf-32?

Последний раз редактировалось HelloUser; 19.05.2014 в 01:49.
HelloUser вне форума Ответить с цитированием
Старый 19.05.2014, 08:41   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

char - это знаковый 8 бит тип. Будет он хранить UTF7, UTF8, ANSI, ASCII или что-то еще это по барабану - это зависит от того, как интерпретировать данный.

Стандартное API Windows интерпретирует wchar_t как UCS2 (но ничего вам не мешает хранить там для себя что угодно в виде того же UTF16 скажем) а char как ANSI. Внутренне на всех NT базированных платформах все переводится в wchar_t/UCS2
waleri вне форума Ответить с цитированием
Старый 06.06.2017, 13:22   #5
nape63
Новичок
Джуниор
 
Регистрация: 06.06.2017
Сообщений: 1
По умолчанию

Массив char увеличить в два раза и в цикле после каждого char добавить
0x00. Нолики - старшие разряды. Было "123"(0x31 0x32 0x33) , а будет 0x31 0x00 0x32 0x00 0x33 0x00.
nape63 вне форума Ответить с цитированием
Старый 04.05.2021, 22:19   #6
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от nape63 Посмотреть сообщение
Массив char увеличить в два раза и в цикле после каждого char добавить
0x00. Нолики - старшие разряды. Было "123"(0x31 0x32 0x33) , а будет 0x31 0x00 0x32 0x00 0x33 0x00.
Я взял тупо в char по 1му байту записал и получил нужные символы, ну мне эти старшие разряды не нужны а числа там помещались в 1 байт
Loksiin12 вне форума Ответить с цитированием
Старый 13.08.2021, 14:05   #7
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от HelloUser Посмотреть сообщение
1)wchar_t* - это вроде как Unicode строка (sizeof(wchar_t) выдает 2 байта на символ) - этот тип строки "хавает" символы любого алфавита.
unicod «весит» 4 байта, а в utf8 отлично раздувается до шести. wchar_t* – отличается **единицей хранения**: байты в whcar_t* строго парные, а char* нарезается поштучно. Юникод же можно навертеть и поверх char. И приличная часть utf16 помещается в одну пару байтов, что несколько повышает вероятность достаточности отдельно взятого whar_t. Но всё равно пришлось завести коды для указания того, что вот этот вот конкретный символ utf16 в одну пару не влез и занял целых две.

Последний раз редактировалось taras-proger77; 13.08.2021 в 14:07.
taras-proger77 вне форума Ответить с цитированием
Старый 13.08.2021, 21:29   #8
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от HelloUser Посмотреть сообщение
char
Русские символы в этот тип уже не влазят.
Loksiin12 вне форума Ответить с цитированием
Старый 13.08.2021, 21:34   #9
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
utf8
Он динамический если я правильно понял. По умолчанию 1 байт, сам тип заканчивается на 8 бит в байте.
Максимум может быть 4 байта не видел символы на 6 байт.
Loksiin12 вне форума Ответить с цитированием
Старый 13.08.2021, 21:43   #10
Loksiin12
Форумчанин
 
Регистрация: 04.10.2020
Сообщений: 136
По умолчанию

а ну да есть и на 6 байт символы.
Loksiin12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
char или wchar_t, ANSI или Unicode? Vladiger Общие вопросы C/C++ 7 09.10.2013 17:13
string-char-wchar_t-char-string чето потерял magog7 Общие вопросы C/C++ 0 08.08.2011 20:21
char в wchar_t softrix Общие вопросы C/C++ 5 08.11.2010 15:40
В заголовок окна выводится только 1 символ из строки( wchar_t ) Руслантус Win Api 4 30.11.2009 19:45