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

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

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

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

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

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

Добрый день.
Например, имеем открытый файл через std:: ofstream. Далее устанавливаем различные локали через http://www.cplusplus.com/reference/ios/basic_ios/imbue/.
Далее пишем в файл.

Вопрос: на что будет влиять локаль? Будет ли изменяться кодировка в файле? Желательно подробное перечисление зависимых параметров. Естественно я читаю справочники и статьи, но чего-то пока плохо доходит, воды много.

http://habrahabr.ru/post/107679/

Например, имеем:
1. Три файла: utf-8, utf-16, utf-32
2. Строка в исходнике "строка"
2. Консоль.
Задача: прочитать текст из трёх файлов, соединить в одно целое + строка из исходника и вывести в консоль.

Как мы это будем делать (в общих словах)? Какая кодировка внутри программы? Зачем нужен Wide string (wchar_t) с непонятной кодировкой?

В любом случаи нужна одна кодировка в программе, какая? wchar_t не подходит т.к. его кодировка неизвестна (какой будет строка L"строка"?). Если так, то зачем нужен wcout (какой в нём смысл? печатать текст из исходников)? Ладно, внутренней кодировкой выберем utf-32. Как его выводить в консоль? Создавать новый поток? Почему в С++ нет уже открытого потока принимающего чётко определенную кодировку (например, utf-32)?

Последний раз редактировалось Stilet; 08.03.2015 в 16:14.
220Volt вне форума Ответить с цитированием
Старый 08.03.2015, 14:39   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Как мы это будем делать (в общих словах)?
Читаем, приводим к одной кодировке и соединяем, прибавляем нужную строку и выводим.

Цитата:
Какая кодировка внутри программы?
Какая угодна лишь бы покрывала все требуемые символы.

Цитата:
Зачем нужен Wide string (wchar_t) с непонятной кодировкой?
Чтобы обеспечить поддержку символов с кодами больше 255. Все-таки не только америка существует и компьютерами пользуются.

Почему без кодировки? Ну а какую выбрали б вы? utf16? utf32? be? le? shift-jis? ..?
И вообще этот тип больше для совместимости и локальных программ оставили. Можно юзать, например, char32_t.

Цитата:
Ладно, внутренней кодировкой выберем utf-32. Как его выводить в консоль? Создавать новый поток? Почему в С++ нет уже открытого потока принимающего чётко определенную кодировку (например, utf-32)?
Потому что не дело это потока вывода разбирать кодовые таблицы.

Юзайте, basic_ostream<char32_t>

Последний раз редактировалось Stilet; 08.03.2015 в 16:14.
p51x вне форума Ответить с цитированием
Старый 08.03.2015, 15:04   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Почему без кодировки? Ну а какую выбрали б вы? utf16? utf32? be? le? shift-jis? ..?
И вообще этот тип больше для совместимости и локальных программ оставили. Можно юзать, например, char32_t.
А какая кодировка? В справочнике ни слова нет http://en.cppreference.com/w/cpp/lan...string_literal
В win 2 байта, в linux 4. Т.е. это что-то непонятное, зачем оно нужно не понимаю. Лучше сделать стандартный поток utf-32. А под конкретную консоль (в случаи необходимости) перекодируем.

Для каких реальных задач нужен wchar_t? Т.е. с обеспечением переносимости. А если оно такое кривое, то зачем по умолчанию создавать wide версии потоков? Даже кодировка не известноа ни разу не встречал упоминания.
220Volt вне форума Ответить с цитированием
Старый 08.03.2015, 15:35   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
А какая кодировка?
Никакой. Не его дело это.

Цитата:
В win 2 байта, в linux 4. Т.е. это что-то непонятное, зачем оно нужно не понимаю.
Он компиляторзависим. Я уже писал: оставлен больше для совместимости. Нужно для локализированных программ. Ну не влазит в 255 все японские иероглифы...

Цитата:
Лучше сделать стандартный поток utf-32. А под конкретную консоль (в случаи необходимости) перекодируем.
Сделан. basic_ostream<char32_t>

Цитата:
Для каких реальных задач нужен wchar_t?
Вы мой пост читали?

Цитата:
А если оно такое кривое, то зачем по умолчанию создавать wide версии потоков?
Оно не кривое. Оно компиляторозависимое. Это больше наследие. Вы же не возмущаетесь, что есть прагмы в гцц и майкрософте, которые не переносимы?

Цитата:
Даже кодировка не известноа ни разу не встречал упоминания.
Потому что ее нет. Еще раз напишу - не его это дело.
p51x вне форума Ответить с цитированием
Старый 08.03.2015, 16:47   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Чего-то мы плохо друг друга понимаем. Видимо, узкие/широкие строки (с абстрагированием от кодировки) нужны чтобы дергать std библиотеку, ну там файл открыть и т.д. Т.е. кодировки могут меняться, а узкие/широкие символы нет. При этом в std нет способов конвертации между узкие/широкие символы и другими кодировками (может не нашёл?)

Представим, что имя файла мы читаем из файла (кодировка utf-16), как мы его конвертируем в узкие/широкие символы?
220Volt вне форума Ответить с цитированием
Старый 08.03.2015, 18:46   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
... Юзайте, basic_ostream<char32_t>
Попробовал создать basic_ostream для консоли, это ещё та сексуально-нетривиальная задача ))
ЗЫ: в винде, для связки буферов консоли с потоковыми буферами:
Код:
    std::basic_filebuf<char_type> buf;
    buf.open("conout$", ios_base::out);
    buf.open("conin$", ios_base::in);

Последний раз редактировалось 220Volt; 08.03.2015 в 21:23.
220Volt вне форума Ответить с цитированием
Старый 08.03.2015, 22:14   #7
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

p51x, спасибо за участие.
220Volt вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текущая локаль, реестр Windows Pcrepair Windows 4 23.01.2013 22:37
Локаль в Delphi XE Stilet Общие вопросы Delphi 2 12.08.2011 14:22