На главную Наши проекты:
Журнал   ·   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.
  
> Вывод в консоль широких уникод-символов
    ОС: 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 -
                                  Цитата Qraizer
                                  В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить.
                                  Найден, установлен. Не в шрифте суть, а в том, что то кодовое место КАЧЕСТВЕННО зарезервировано консорциумом уникода за широкими символами. И они из принципа пытаются выводиться виндой аки 2 символа. FAR как-то умудряется это обойти.
                                  Чудеса случаются! И вот они: я вывел широкий символ по координатам 10;10 скажем. А затем пишу в место 11;10 другой символ, а мне говорит ОС - фиг вам! И выводит его в 12;10 !!! Т.е. она запомнила, что место занято широким и ни в какую туда ничего другое не суёт. Тварь. (простите за ругательство).
                                  Как быть??? :wall: :wall: :wall:
                                    Цитата Славян @
                                    Как быть???

                                    Мож это заюзать, а не злиться на M$ костыли? :)
                                      Цитата Qraizer @
                                      В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить.
                                      GNU Unifont Glyphs
                                      Прикреплённая картинка
                                      Прикреплённая картинка


                                      Добавлено
                                      Цитата Славян @
                                      Не в шрифте суть, а в том, что то кодовое место КАЧЕСТВЕННО зарезервировано консорциумом уникода за широкими символами.
                                      Ты что-то путаешь. Все эти регионы обычные, суррогатные пары лежат в D800-DFFF.

                                      Добавлено
                                      Стоп, ты под широкими понимаешь визуальный размер по горизонтали, что ли? Секундочку, как ты себе представляешь подобное в моноширинной консоли?

                                      Добавлено
                                      И эта, скриншот FARа покажи, что ли. Аж заинтриговал.
                                      Сообщение отредактировано: Qraizer -
                                        Цитата Qraizer @
                                        GNU Unifont Glyphs

                                        Супер!!! Да и сам шрифт порадовал)

                                        user posted image
                                          Цитата Qraizer
                                          ты под широкими понимаешь визуальный размер по горизонтали, что ли?
                                          Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов.

                                          Цитата Qraizer
                                          Секундочку, как ты себе представляешь подобное в моноширинной консоли?
                                          Просто. Два места отводят под символы двойной ширины. Всё выглядит логично.

                                          Цитата Qraizer
                                          И эта, скриншот FARа покажи, что ли.
                                          Какая часть интересна? А! понял. Минутку...

                                          Добавлено
                                          Цитата JoeUser
                                          Супер!!! Да и сам шрифт порадовал)
                                          Да, есть такая корявая особенность у корявых шрифтов-FAR'ов. :yes-sad:
                                            Цитата Qraizer @
                                            скриншот FARа покажи, что ли.
                                            Как-то так:
                                            Прикреплённая картинка
                                            Прикреплённая картинка
                                              Цитата Славян @
                                              Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов.

                                              :lool:
                                                Цитата Славян @
                                                Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов.
                                                Эм-м... Во-первых, не двойная, а-таки широкая, у пропорциональных шрифтов понятия ширины как таковой нет, она варьируется от символа к символу. Во-вторых, тогда что же не так? Попросил вдвое шире – дали. Не?
                                                  Цитата Qraizer
                                                  Во-первых, не двойная, а-таки широкая, у пропорциональных шрифтов понятия ширины как таковой нет, она варьируется от символа к символу.
                                                  Да, вы правы. Несколько загнул я.

                                                  Цитата Qraizer
                                                  Во-вторых, тогда что же не так? Попросил – дали. Не?
                                                  Хотелось, чтобы как у FAR'а был вывод: один символ - одно место. Но не получается.
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


                                                  Рейтинг@Mail.ru
                                                  [ Script execution time: 0,0793 ]   [ 21 queries used ]   [ Generated: 20.04.24, 02:21 GMT ]