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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2014, 18:05   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Строковый литералы

Здравствуйте.
Из справочника:
Код:
"---"                    (1) 
L "---"                  (2) 
u8 "---"                 (3) 
u "---"                  (4) 
U "---"                  (5) 
prefix(optional) R "---" (6)
1) Narrow multibyte string literal. The type of an unprefixed string literal is const char[]
2) Wide string literal. The type of a L"..." string literal is const wchar_t[]
3) UTF-8 encoded string literal. The type of a u8"..." string literal is const char[]
4) UTF-16 encoded string literal. The type of a u"..." string literal is const char16_t[]
5) UTF-32 encoded string literal. The type of a U"..." string literal is const char32_t[]
6) Raw string literal. Used to avoid escaping of any character, anything between the delimiters 
becomes part of the string, if prefix is present has the same meaning as described above.
Narrow multibyte string literal это ведь не utf? Почему тогда символы "цапля" == u8"цапля", т.е. в чем отличие между 1 и 3?

Можно подумать - все дело в кодировке исходных кодов (они у меня utf8), ведь для компилятора это просто цифры. Тогда зачем нужны префиксы? Почему и как компилятор соображает в такой ситуации: L"Hello", увеличивая её в размере.

В windows на qtcreator не выходит поэкспериментировать с кодировками, сохраняю, например, один символ в utf-32, а размер файла 12 байт.

Что такое Narrow multibyte string literal? Какая кодировка?
220Volt вне форума Ответить с цитированием
Старый 11.07.2014, 09:22   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

тип данных у 1 и 3 один и тот же, а вот содержимое будет разным.
Отличия можете увидеть используя функции strlen() или puts().

Компилятор "соображает" увидев префикс L что каждый символ должен быть 2 байта а не один.

Префиксы нужны, чтобы знать как закодировать слово "цапля".
В исходнике разницы не будет, поскольку сам исходник сохраняется какой-то одной кодировке. А вот если вы запишете все эти литералы в один файл (скажем через fwrite) и откроете файл hex редактором, то сразу увидите отличия.
waleri вне форума Ответить с цитированием
Старый 11.07.2014, 09:58   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

А вы пробывали? Кодировка исходников utf-8? Повторюсь, строки одинаковые. Думаю что Narrow multibyte string это и есть кодировка исходников.
Еще интересный момент: почему в std нет string'a для utf-8, при наличии для utf-16 и utf-32?
Код:
std::basic_string<char16_t> str = u"漢字";
std::cout << str.length(); // cout: 2

const char16_t t1[] = u"漢字";
std::cout << sizeof(t1) << '\n';   // cout: 6

Последний раз редактировалось 220Volt; 11.07.2014 в 10:00.
220Volt вне форума Ответить с цитированием
Старый 11.07.2014, 10:14   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Плохой пример, поищу символы с более чем 2х байтовым размером.
220Volt вне форума Ответить с цитированием
Старый 11.07.2014, 11:45   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Приведите минимальный компилирующийся код, который проиллюстрирует проблему.
_Bers вне форума Ответить с цитированием
Старый 11.07.2014, 11:59   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Не то чтобы проблемы, скорее вопросы:
1. Что такое Narrow multibyte string literal (какая кодировка)?
2. Почему std::string не поддерживает utf-8, есть ли в планах?
220Volt вне форума Ответить с цитированием
Старый 11.07.2014, 12:34   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

1) Любая... например utf7 и utf8, ascii. Все это - char. И длинна одинаковой строки в различных кодировках может быть разной (в байтах).
2) Зачем std::string поддерживать utf8? В уверенны, что std::string вообще поддерживает кодировку? Не путайте UTF16 и UCS16 - это две большие разницы.

Кодировка исходников зависит от желаний и возможностей редактора и компилятора.

Последний раз редактировалось waleri; 11.07.2014 в 12:36.
waleri вне форума Ответить с цитированием
Старый 11.07.2014, 13:35   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
1) Любая... например utf7 и utf8, ascii. Все это - char. И длинна одинаковой строки в различных кодировках может быть разной (в байтах).
2) Зачем std::string поддерживать utf8? В уверенны, что std::string вообще поддерживает кодировку? Не путайте UTF16 и UCS16 - это две большие разницы.

Кодировка исходников зависит от желаний и возможностей редактора и компилятора.
1. Т.е. мы создаем в исходнике строковой литерал "lala" и передаем его в библиотеку, которая ждет определенную кодировку. И в зависимости от различных условий (компилятор, настроение, погода) получаем различный результат. Не верю, должны быть какие-то правила.
2. Скажите, индексация в строке, метолы length() и другое одинаковы у ascii строке и utf-8 строки (кириллица)? Вот для этого std::string должен поддерживать именно utf-8, а не просто char.
220Volt вне форума Ответить с цитированием
Старый 11.07.2014, 16:15   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

1)
Библиотека ожидает определенный тип - char, wchar_t, int, и т.д.
В языке С++ нет типа utf, и т.д, есть указатель на char или wchar_t и производные от них. Каждый из приведенных префиксов использует свой тип, но если типы совппадают, как для UTF8, тогда компилятор ничем не поможет.

2)
Количество БУКВ совпдаает, но количество БАЙТ - нет. length возвращает количество БАЙТ.
waleri вне форума Ответить с цитированием
Старый 11.07.2014, 16:49   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
1)
Библиотека ожидает определенный тип - char, wchar_t, int, и т.д.
В языке С++ нет типа utf, и т.д, есть указатель на char или wchar_t и производные от них. Каждый из приведенных префиксов использует свой тип, но если типы совппадают, как для UTF8, тогда компилятор ничем не поможет.

2)
Количество БУКВ совпдаает, но количество БАЙТ - нет. length возвращает количество БАЙТ.
1. Чта мешает в документации к библиотеки написать: передавать utf-8 (или любой другой тип). То что utf-8 имеет тип char и не был создан дополнительный тип вполне логично и объяснимо. И c++ официально признал utf введя соответствующие строковые литералы и типы char16_t и char32_t, в с++ они являются фундаментальными, а не псевдонимом.
2. Легко ведь проверяется
Код:
u16string str = u"hello";
cout << str.length();       // cout: 5
cout << sizeof(u"hello");   // 12
Вот что пишут одни из разработчиков библиотек о std::string
https://developer.gnome.org/gtkmm-tu...string.html.en
220Volt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковый массив impulsgraw C# (си шарп) 4 19.11.2011 12:43
Строковый тип Krasopetka Паскаль, Turbo Pascal, PascalABC.NET 2 17.11.2011 21:17
Строковый файл ensoleille Помощь студентам 5 15.07.2011 00:10
Строковый тип dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 1 26.08.2010 00:53
строковый тип gessi Помощь студентам 3 25.11.2009 09:40