powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::ofstream и char8_t
40 сообщений из 40, показаны все 2 страниц
std::ofstream и char8_t
    #40084357
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не компилируется вывод u8 строк:

Код: plaintext
1.
2.
ofstream out;
out << u8"Привет."


MSVC + включён latest draft версия C++.

А что делать-то? Ну кроме явного приведения к char *. :)
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084438
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я чувствую, что в С++20 нас ждёт глобальный песец. Вот именно из-за введения типов
аля char8_t и std::u8string. Дураками будут выглядеть все, кто написал u8 или вообще
использовал utf-8 без особой необходимости.

А пользователи std::wstring будут хитро ухмыляться себе под нос.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084439
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА пользователи std::wstring будут хитро ухмыляться себе под нос.

Ага, они-то на неспособность её вывестись в std::cout наступили гораздо раньше...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084446
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravА пользователи std::wstring будут хитро ухмыляться себе под нос.

Ага, они-то на неспособность её вывестись в std::cout наступили гораздо раньше...

В том то и дело, что они решили эту проблему лет 20-ть назад (std::wcout).

Сейчас я наблюдаю шедевральное приключение. В MSVC если файл исходника в
utf-8 without BOM, то и строка "Привет" в программе в кодировке utf-8. Если файл
utf-8 with BOM, то строка в кодировке Windows-1251.

Возможно я что-то перепутал и тогда всё наоборот. При этом префикс u8 не даёт
никакой определённости и его результат зависит от кодировки файла. Ещё существет
#pragma, которая явно задаёт кодировку строк в utf-8.

При этом если файл исходника utf-8 without BOM, то кодировка широких символов
L"Привет" слетает — оно не работает. Или не работало недавно.

Сейчас ещё добавятся типы char8_t и std::u8string и тогда количество вариантов
явно увеличится. Скоро полетит вообще весь код, где написано u8"Операция Ы".
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084449
так ведь работает всё:
Код: plaintext
1.
2.
    ofstream out("file.txt");
    out << "Привет.\n";
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084451
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ideone под С++14 - нормас.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084453
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravСейчас я наблюдаю шедевральное приключение. В MSVC если файл исходника в
utf-8 without BOM, то и строка "Привет" в программе в кодировке utf-8. Если файл
utf-8 with BOM, то строка в кодировке Windows-1251.

"О, сколько нам открытий чудных..."

Каким способом по-твоему компилятор должен угадать кодировку исходника чтобы привеcти твой
литерал в запрошенную тобой utf-8?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084454
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravСейчас я наблюдаю шедевральное приключение. В MSVC если файл исходника в
utf-8 without BOM, то и строка "Привет" в программе в кодировке utf-8. Если файл
utf-8 with BOM, то строка в кодировке Windows-1251.

"О, сколько нам открытий чудных..."

Каким способом по-твоему компилятор должен угадать кодировку исходника чтобы привеcти твой
литерал в запрошенную тобой utf-8?..

Давай по другому? Программисты на Шарпе испытывают такие вселенские проблемы?
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084455
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В ideone под С++14 - нормас.

Конечно. Речь идёт о включённой опции "Preview - Features from the Latest C++ Working Draft (/std:c++latest)" в Студии.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084456
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravПрограммисты на Шарпе испытывают такие вселенские проблемы?

Шарпеи пишут исходники в редакторах, отличных от среды, автоматически (принудительно)
сохраняющей их в кодировке UTF-8 с ВОМ?

Зачем, по-твоему, у компиляторов есть ключ для указания кодировки исходника?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084457
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravПрограммисты на Шарпе испытывают такие вселенские проблемы?

Шарпеи пишут исходники в редакторах, отличных от среды, автоматически (принудительно)
сохраняющей их в кодировке UTF-8 с ВОМ?

Зачем, по-твоему, у компиляторов есть ключ для указания кодировки исходника?..

Программисты Java тоже в 99% случаев используют исходники в UTF-8 (как умолчательный тип кодировки).
Хотя бывает из левых репозитариев залетают сорцы в 1251 но обычно среда подсказывает о нестандартной
кодировке. И ее фиксят. И есть внутренние соглашения на проектах о том что вся команда обычно использует одну
кодировку. Кодировка вобщем - это опция компиллятора или сборщика.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084458
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
В ideone под С++14 - нормас.

Конечно. Речь идёт о включённой опции "Preview - Features from the Latest C++ Working Draft (/std:c++latest)" в Студии.

А если собрать твой исходник с помощью Command Line (cl) ?
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084459
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravПрограммисты на Шарпе испытывают такие вселенские проблемы?

Шарпеи пишут исходники в редакторах, отличных от среды, автоматически (принудительно)
сохраняющей их в кодировке UTF-8 с ВОМ?

Зачем, по-твоему, у компиляторов есть ключ для указания кодировки исходника?..

Да, тут я затупил, сорри.

Наверное, потому что в GUI Студии никогда не видел принудительной установки кодировки.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084460
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav
пропущено...

Конечно. Речь идёт о включённой опции "Preview - Features from the Latest C++ Working Draft (/std:c++latest)" в Студии.

А если собрать твой исходник с помощью Command Line (cl) ?

Да ничего там не поменяется, хоть как собирай. У строки u8"..." поменялся тип. Раньше он был char[]. Теперь он другой.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084475
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Сейчас я наблюдаю шедевральное приключение. В MSVC если файл исходника в
utf-8 without BOM, то и строка "Привет" в программе в кодировке utf-8. Если файл
utf-8 with BOM, то строка в кодировке Windows-1251.
Не так. По умолчанию, при отсутствии BOM и ключей компиляции, задающих кодировку, msvc считает, что исходник в текущей кодовой странице, и исполняемый файл должен выводить строки тоже в текущей кодовой странице. Поэтому сточка остается как есть. А при наличии BOM он понимает, что исходник в utf8, но исполняемый файл все также генерируется в текущей кодовой странице.
petrav

При этом если файл исходника utf-8 without BOM, то кодировка широких символов
L"Привет" слетает — оно не работает. Или не работало недавно.
Ну да, если нет BОМ и исходная кодировка не указана явно, то строчка перекодируется не из utf8, а из текущей кодовой страницы.
Это легаси, но поведение по умолчанию нельзя изменить, потому что это сломает сборку старых проектов.

https://docs.microsoft.com/en-us/cpp/build/reference/source-charset-set-source-character-set?view=msvc-160
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084509
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Скорее всего пофиксят в c++23
https://rawgit.com/sg16-unicode/sg16/master/papers/p1423r2.html

Но вообще хранить многоязычный текст исходнике это плохой стиль.
Максимум что имеет смысл это разные технические литералы. Но для них u8 не нужен, они все в ascii.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084512
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо для них u8 не нужен, они все в ascii.

А зачем он тогда вообще нужен?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084513
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Anatoly MoskovskyНо для них u8 не нужен, они все в ascii.

А зачем он тогда вообще нужен?

Так давно уже говорилось и повторялось, что utf-8 вообще ни для чего не нужен.
А вот вреда от него целый состав (из вагонов).
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084515
а что будет без utf-8 ?
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084516
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
а что будет без utf-8 ?

UTF32.

Сейчас, конечно, набегут фанатики и будут рассказывать про то как они сэкономили
один мегабайт памяти с utf-8. И это всё при том, что они работают под Depeche Mode во
второй вкладке с Ютубом. И Гугл Хром прокачивает за рабочий день гигабайты.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084517
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravUTF32.

Разбудите меня когда в Линухе появится wopen() или хотя бы fwopen()...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084518
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravUTF32.

Разбудите меня когда в Линухе появится wopen() или хотя бы fwopen()...

Вы уверены, что функция открытия файла имеет какое-то отношение к
кодировке файла? Мне кажется, что нет. Да и Линукс тут не причём.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084519
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А зачем он тогда вообще нужен?

u8"" нужен, если прижмет и все-таки надо получить литерал с utf8 из платформозависимой кодировки.

А дальше, зная что char8_t (результат u8 с C++20) - это utf-8 то можно построить API который utf-8 обрабатывает по-другому.
Например под виндой возможно (не знаю как на самом деле) запись utf-8 в cout через стандартный char* API не приведет к ожидаемому результату т.к. вместо перевода в wchar он выведет строку как набор 8-bit char.
Поэтому вендоры могут добавить char8_t* API (как предложено в p1423r2 выше) и реализовать перевод в кодировку поддерживаемую ОСью
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084520
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravВы уверены, что функция открытия файла имеет какое-то отношение к кодировке файла?

Я уверен, что функция открытия файла принимает на вход строку. Покажите мне, как Вы
открываете файл с именем, хранящимся в std::wstring.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084532
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВы уверены, что функция открытия файла имеет какое-то отношение к кодировке файла?

Я уверен, что функция открытия файла принимает на вход строку. Покажите мне, как Вы
открываете файл с именем, хранящимся в std::wstring.
fopen() а что?
Это на винде надо думать какой там ширины буква в имени файла, в нормальных системах это вообще не проблема.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084533
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlfopen() а что?

Код: sql
1.
2.
std::wstring filename(L"aaa.txt");
fopen(filename.c_str(), L"r");


Так? И компилятор жрёт? И оно работает?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084534
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

White Owlfopen() а что?

Код: sql
1.
2.
std::wstring filename(L"aaa.txt");
fopen(filename.c_str(), L"r");


Так? И компилятор жрёт? И оно работает?..
Вот так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>

int main(int argc, char **argv) {
	char buf[1024];
	FILE *fp = fopen(argv[1], "r");
	fgets(buf, sizeof(buf), fp);
	fclose(fp);
	puts(buf);
	return 0;
}

А то что имя файла в юникоде и текст в юникоде - программиста не колышет, для этих тонкостей ОС есть.

А то что ты нарисовал со всякими wstring и модификаторами констант - это извращение и уродство.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084603
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Вот так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>

int main(int argc, char **argv) {
	char buf[1024];
	FILE *fp = fopen(argv[1], "r");
	fgets(buf, sizeof(buf), fp);
	fclose(fp);
	puts(buf);
	return 0;
}

А то что имя файла в юникоде и текст в юникоде - программиста не колышет
Это всё, конечно, прэлэстно, но petrav "яростно топил" за UTF32.
И вот тут, лично у меня, возникает вопрос: как скормить в Цэ-API строку, три четверти байт которой - нулевые.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084627
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

petravUTF32.

Вот видишь, Сов говорит, что UTF-32 не нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084644
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Это всё, конечно, прэлэстно, но petrav "яростно топил" за UTF32.
И вот тут, лично у меня, возникает вопрос: как скормить в Цэ-API строку, три четверти байт которой - нулевые.
Скормить где и куда?

Как данные для прочитать из файла/базы, потом нарисовать на экране текст и обратно прочитать из поля ввода и записать в базу? Это отработано уже десятилетия. Любой посетитель этого топика (ну кроме совсем уж студентов первогодок) это делал неоднократно.

А вот то что тут так яростно обсуждается по запихиванию юникодных строк в исходный текст программы - вот это дурацкий вопрос и совершенно не нужное извращение. Хотя да, с технической точки зрения можно использовать модификаторы строк объясняя компилятору что вот сейчас мы сойдем с ума и будем запихивать в исходник широкую строку.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084648
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это уже примерно третий топик на тему utf-8.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084653
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭто отработано уже десятилетия. Любой посетитель этого топика (ну кроме совсем уж
студентов первогодок) это делал неоднократно.

Да, да. Один пользователь сохраняет файл "абв", второй пользователь пытается открыть файл
"абв" и получает "файл не найден". Любой посетитель этого топика тут же поймёт "опаньки, у
них разные локали, а любая линуховая файловая система воспринимает имя файла чисто как
последовательность байт". Щазззз...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084765
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Да, да. Один пользователь сохраняет файл "абв", второй пользователь пытается открыть файл
"абв" и получает "файл не найден". Любой посетитель этого топика тут же поймёт "опаньки, у
них разные локали, а любая линуховая файловая система воспринимает имя файла чисто как
последовательность байт". Щазззз...
эээ... Как бы тебе сказать.... Да.

Вот с линуксовой машины я свободно открываю файлы с юникодными именами (кириллица и хирагана) записанные на NAS. В том числе и тем примитивным кодом что я тут показал пару постов тому назад.

А вот на Вин10, есть у меня программка обучения японского которая и создает эти самые файлы с хираганой в имени - так вот обратно она их открыть не может "no such file". Сама создала, сама потеряла. Поэтому приходится следить чтобы все файлы она создавала с английскими именами, либо заходить на NAS с линуксовой машины и переименовывать файлы. Причем это переименование я могу делать как в sh, так и в Nemo, и даже в линуксовой версии FAR.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084824
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlя свободно открываю файлы с юникодными именами (кириллица и хирагана) записанные на NAS.

А теперь, внимание, вопрос: какая файловая система и протокол доступа?

Повторяю медленно: ты создаёшь файлы не "с кириллицей и хираганой", а с пачкой байт в
которую твоя кириллица и хирагана воспроизводимо конвертируются. Локалью, гвоздиком
прибитой в utf-8.

Твои коллеги в дельфийском разделе, обращаясь к неинициализированным переменным и мусору в
освобождённой памяти тоже говорят "так работает же всё уже десятки лет", ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084826
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку Белый Сова работает с Linux, то основные протоколы доступа к фс специфицированы на уровне слоя VFS.
Тоесть если VFS гарантирует точное сохранение имен файлов как неспецифицированных блобов то и реализации
такие как ext4, xfs, btrfs ... e.t.c. нормально схавают любые коды символов и сохранит их "as is".

IMHO.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084829
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот именно про это я и говорил. Всё работает пока текущая пользовательская локаль прибита
гвоздиком. Шаг влево-шаг вправо - опаньки.

Хотя с его NAS-ом оно может работать и с любой локалью поскольку (внезапно) там NTFS и
SMB, а линуховский драйвер NTFS переводит байты из текущей локали в (опять внезапно) юникод.

Поэтому разбудите меня, когда из ядра выпилят все локали кроме utf-8, чтобы настало
единообразное благолепие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084830
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO сложно будет с Collation.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40084838
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие ещё collation? У Сова программы принимают строки как есть и используют как есть,
(только) поэтому работают.

Регистронечувствительность (в том числе файловых систем) - от Лукавого.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40086419
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, я и сейчас прекрасно пользуюсь utf8 в обычном std::string (basic_string<char>) вместе со стеком GTK+ и горя не знаю. В GTK+ даже под вендой всё на utf8... Выставил при старте приложухи локаль "ru_RU.UTF-8" и норм. Если надо вывести в поток в другой кодировке, выставил через imbue() локаль для ostream и пиши сколько влезет.
В чём проблема?

Просто сделали std::u8string ТОЛЬКО для utf8. По мне так очень удобно! Можно хранить всё в utf8, а для всего остального использовать системную локаль и всё будет прекрасно перекодироваться туда-обратно.
...
Рейтинг: 0 / 0
std::ofstream и char8_t
    #40087337
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, прикрутят ICU, настроят локаль, пнут в эту библиотеку строку, получат ключ сортировки и будут его сравнивать.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::ofstream и char8_t
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]