На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Вывод в консоль широких уникод-символов
    ОС: Windows, AMD64=x64 (внимание! вроде бы разные сборки винды работают по-разному)

    Есть файл с уникод-названием, скажем: "test𧻓ﵑ₩". (у кого не показывается - после слова "test" идут 3 уникод-символа двойной ширины).
    Вывожу их на экран:
    ExpandedWrap disabled
      HANDLE h = ::GetStdHandle( STD_OUTPUT_HANDLE );
      unsigned long zap; // кол-во записаных символов
      ::WriteConsoleW( h, buf, wcslen(buf), &zap, NULL); // buf - wchar_t буфер, где это самое имя файла (например, входной аргумент argv[1])

    На выходе получаю:
    ExpandedWrap disabled
      test𧻓 ﵑ ₩
    У кого не показывается, дело происходит так:
    пишется слово "test", а после пишется уникод-символ, потом пробел, потом снова уникод-символ, потом снова пробел и т.д.

    Вопрос: как заставить ОС вмещать КАЖДЫЙ выводимый уникод-символ в одно место?
    П.С. даже команда dir выводит с этими "пробелами". FAR выводит норм, без этих дополн. пустот!
      Цитата Славян @
      П.С. даже команда dir выводит с этими "пробелами". FAR выводит норм, без этих дополн. пустот!

      Потому как такой вывод - нелегетимен! Используй символы из набора установленной кодовой страницы. Винда такое не прощает! :lol:
      Можно конечно поизвращаться и поставить ConEmu, а в нем уже поставить chcp 65001.
      Но все равно всего unicode набора ты не получишь, а только по частям.
      В настройках ConEmu твоей строке подходит настройки, например:
      шрифт - Liberation Mono
      набор - Johab
      Но все равно, ConEmu - это костыль.
        Коды символов покажи-ка, Славян.
          Цитата Qraizer @
          Коды символов покажи-ка, Славян.

          test𧻓ﵑ₩ == \u0074\u0065\u0073\u0074\ufad7\ufd51\uffe6
            Ага, они самые!

            Добавлено
            Цитата JoeUser
            Но все равно всего unicode набора ты не получишь, а только по частям.
            Но раз FAR выводит, то он явно не заморачивается с этими частями. Как-то говорит винде: выведи эти вти вот двойн.байты и всё. И всё выводится. Я тоже так хочу.
              Всё, что можно посоветовать, найти шрифт с поддержкой нужных символов. У меня даже WinWord отказался CJK Compatibility Ideographs показывать. Нету в его шрифтах такого
                Да всё есть, и всё показывается! Вопрос то: как выводить показываемое без "пробелов"? :-?
                  С консоли можно сделать chcp, а в свойствах указать правильный шрифт. Программно – заменой chcp является SetConsoleCP() и SetConsoleOutputCP(), а вот шрифт... есть только недокументированная BOOL WINAPI SetConsoleFont(HANDLE hOut, DWORD dwFontSize), можно попробовать импортировать из kernel32 явным образом.
                  Сообщение отредактировано: Qraizer -
                    Увы, но SetConsoleOutputCP (и SetConsoleCP) возвращают 0 (справка - "If the function succeeds, the return value is nonzero."). :'(
                      Цитата Славян @
                      Но раз FAR выводит

                      FAR - хоть и консольная программа, но имеет свои функции работы с символами, отличные от консольных "возможностей". Попробуй библиотеку ncurses, и я уверен получишь те же "лишние пробелы". Т.к. она работает с теми возможностями консоли (а вернее терминала), которые есть.

                      Добавлено
                      Цитата Славян @
                      Увы, но SetConsoleOutputCP (и SetConsoleCP) возвращают 0 (справка - "If the function succeeds, the return value is nonzero.").

                      Ради интереса, попробуй это запустить/отдебажить под ConEmu.

                      Добавлено
                      Славян, и еще ... а будут лишние пробелы если строку вывести посимвольно?
                        Ну ты хоть бы GetLastError() посмотрел. У меня вон
                        ExpandedWrap disabled
                          #include <windows.h>
                          #include <iostream>
                           
                          int main()
                          {
                            SetConsoleOutputCP(65001);
                           
                            std::cout << u8"Hello, world!\nЗдравствуй, мир!..";
                          }
                        Вполне себе кажет
                        ExpandedWrap disabled
                          Hello, world!
                          Здравствуй, мир!..


                        Добавлено
                        Скорее всего ты неверную кодепейдж передаёшь
                          Я посмотрел! 87 - неверный параметр. Я 1200 выставлял.

                          Добавлено
                          Цитата JoeUser
                          FAR - хоть и консольная программа, но имеет свои функции работы с символами, отличные от консольных "возможностей".
                          Сомнительно, там всё ж через WinAPI делается, так что способ какой-то имеется.

                          Цитата JoeUser
                          и еще ... а будут лишние пробелы если строку вывести посимвольно?
                          Можно, конечно, потестить. Но чуется, что метод неверный, ибо выводить на экран 100*100 символов посимвольно - самоубийственно! :yes-sad:

                          Добавлено
                          SetConsoleOutputCP(65001); у меня, Qraizer, тоже хорошо обрабатывается (успешно). Но мне она не нужна... Мне 1200-я нужна!

                          Добавлено
                          Цитата
                          выводить на экран 100*100 символов посимвольно - самоубийственно!
                          Потестил на само́м FAR'е: жутчайшее слоу-мо!!! :wall: :wall: :wall: Неужто они так и делают?? :fool:
                            Нет такой страницы, как 1200. Точнее, она-то есть, и просто обозначает юникод, т.е. кодировку символов. Но к этой кодировке нужны ещё национальные и культурные особенности, определяющие совокупность методов их обработки, а 1200-ая их просто не содержит. Как ASCII обозначает любые символы 0...255, но содержит информацию о методах обработки только для 0...127.
                              Я к тому, что одного только указания на юникод достаточно для корректного восприятия символов, но этого недостаточно для визуализации. ОС по меньшей мере должна смочь связать его с испрльзуемым шрифтом и преобразовать должным образом. Я вот просто пробежался по всем кодировкам в Ворде, и ни одна не смогла отобразить все три символа. Самый первый умеют отображать китайские кодовые страницы, например, Big5 или MAC, но вот CNS тоже умеет, но выглядит он иначе. При этом в этих страницах нет правил для остальных двух символов. Второй относится к арабским, третий к специальным, культурно нейтральным.
                              В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить.
                              Сообщение отредактировано: Qraizer -
                                Шрифт Google Noto - 1.1Gb :)

                                Цитата Qraizer @
                                В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить.

                                Говорят, что это самый полный по языкам.
                                Сообщение отредактировано: JoeUser -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0457 ]   [ 17 queries used ]   [ Generated: 16.04.24, 17:59 GMT ]