Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.14.164] |
|
Сообщ.
#1
,
|
|
|
ОС: Windows, AMD64=x64 (внимание! вроде бы разные сборки винды работают по-разному)
Есть файл с уникод-названием, скажем: "test𧻓ﵑ₩". (у кого не показывается - после слова "test" идут 3 уникод-символа двойной ширины). Вывожу их на экран: HANDLE h = ::GetStdHandle( STD_OUTPUT_HANDLE ); unsigned long zap; // кол-во записаных символов ::WriteConsoleW( h, buf, wcslen(buf), &zap, NULL); // buf - wchar_t буфер, где это самое имя файла (например, входной аргумент argv[1]) На выходе получаю: test𧻓 ﵑ ₩ пишется слово "test", а после пишется уникод-символ, потом пробел, потом снова уникод-символ, потом снова пробел и т.д. Вопрос: как заставить ОС вмещать КАЖДЫЙ выводимый уникод-символ в одно место? П.С. даже команда dir выводит с этими "пробелами". FAR выводит норм, без этих дополн. пустот! |
Сообщ.
#2
,
|
|
|
Цитата Славян @ П.С. даже команда dir выводит с этими "пробелами". FAR выводит норм, без этих дополн. пустот! Потому как такой вывод - нелегетимен! Используй символы из набора установленной кодовой страницы. Винда такое не прощает! Можно конечно поизвращаться и поставить ConEmu, а в нем уже поставить chcp 65001. Но все равно всего unicode набора ты не получишь, а только по частям. В настройках ConEmu твоей строке подходит настройки, например: шрифт - Liberation Mono набор - Johab Но все равно, ConEmu - это костыль. |
Сообщ.
#3
,
|
|
|
Коды символов покажи-ка, Славян.
|
Сообщ.
#4
,
|
|
|
Цитата Qraizer @ Коды символов покажи-ка, Славян. test𧻓ﵑ₩ == \u0074\u0065\u0073\u0074\ufad7\ufd51\uffe6 |
Сообщ.
#5
,
|
|
|
Ага, они самые!
Добавлено Цитата JoeUser Но раз FAR выводит, то он явно не заморачивается с этими частями. Как-то говорит винде: выведи эти вти вот двойн.байты и всё. И всё выводится. Я тоже так хочу. Но все равно всего unicode набора ты не получишь, а только по частям. |
Сообщ.
#6
,
|
|
|
Всё, что можно посоветовать, найти шрифт с поддержкой нужных символов. У меня даже WinWord отказался CJK Compatibility Ideographs показывать. Нету в его шрифтах такого
|
Сообщ.
#7
,
|
|
|
Да всё есть, и всё показывается! Вопрос то: как выводить показываемое без "пробелов"?
|
Сообщ.
#8
,
|
|
|
С консоли можно сделать chcp, а в свойствах указать правильный шрифт. Программно – заменой chcp является SetConsoleCP() и SetConsoleOutputCP(), а вот шрифт... есть только недокументированная BOOL WINAPI SetConsoleFont(HANDLE hOut, DWORD dwFontSize), можно попробовать импортировать из kernel32 явным образом.
|
Сообщ.
#9
,
|
|
|
Увы, но SetConsoleOutputCP (и SetConsoleCP) возвращают 0 (справка - "If the function succeeds, the return value is nonzero.").
|
Сообщ.
#10
,
|
|
|
Цитата Славян @ Но раз FAR выводит FAR - хоть и консольная программа, но имеет свои функции работы с символами, отличные от консольных "возможностей". Попробуй библиотеку ncurses, и я уверен получишь те же "лишние пробелы". Т.к. она работает с теми возможностями консоли (а вернее терминала), которые есть. Добавлено Цитата Славян @ Увы, но SetConsoleOutputCP (и SetConsoleCP) возвращают 0 (справка - "If the function succeeds, the return value is nonzero."). Ради интереса, попробуй это запустить/отдебажить под ConEmu. Добавлено Славян, и еще ... а будут лишние пробелы если строку вывести посимвольно? |
Сообщ.
#11
,
|
|
|
Ну ты хоть бы GetLastError() посмотрел. У меня вон
#include <windows.h> #include <iostream> int main() { SetConsoleOutputCP(65001); std::cout << u8"Hello, world!\nЗдравствуй, мир!.."; } Hello, world! Здравствуй, мир!.. Добавлено Скорее всего ты неверную кодепейдж передаёшь |
Сообщ.
#12
,
|
|
|
Я посмотрел! 87 - неверный параметр. Я 1200 выставлял.
Добавлено Цитата JoeUser Сомнительно, там всё ж через WinAPI делается, так что способ какой-то имеется.FAR - хоть и консольная программа, но имеет свои функции работы с символами, отличные от консольных "возможностей". Цитата JoeUser Можно, конечно, потестить. Но чуется, что метод неверный, ибо выводить на экран 100*100 символов посимвольно - самоубийственно! и еще ... а будут лишние пробелы если строку вывести посимвольно? Добавлено SetConsoleOutputCP(65001); у меня, Qraizer, тоже хорошо обрабатывается (успешно). Но мне она не нужна... Мне 1200-я нужна! Добавлено Цитата Потестил на само́м FAR'е: жутчайшее слоу-мо!!! Неужто они так и делают?? выводить на экран 100*100 символов посимвольно - самоубийственно! |
Сообщ.
#13
,
|
|
|
Нет такой страницы, как 1200. Точнее, она-то есть, и просто обозначает юникод, т.е. кодировку символов. Но к этой кодировке нужны ещё национальные и культурные особенности, определяющие совокупность методов их обработки, а 1200-ая их просто не содержит. Как ASCII обозначает любые символы 0...255, но содержит информацию о методах обработки только для 0...127.
|
Сообщ.
#14
,
|
|
|
Я к тому, что одного только указания на юникод достаточно для корректного восприятия символов, но этого недостаточно для визуализации. ОС по меньшей мере должна смочь связать его с испрльзуемым шрифтом и преобразовать должным образом. Я вот просто пробежался по всем кодировкам в Ворде, и ни одна не смогла отобразить все три символа. Самый первый умеют отображать китайские кодовые страницы, например, Big5 или MAC, но вот CNS тоже умеет, но выглядит он иначе. При этом в этих страницах нет правил для остальных двух символов. Второй относится к арабским, третий к специальным, культурно нейтральным.
В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить. |
Сообщ.
#15
,
|
|
|
Шрифт Google Noto - 1.1Gb
Цитата Qraizer @ В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить. Говорят, что это самый полный по языкам. |
Сообщ.
#16
,
|
|
|
Цитата Qraizer Найден, установлен. Не в шрифте суть, а в том, что то кодовое место КАЧЕСТВЕННО зарезервировано консорциумом уникода за широкими символами. И они из принципа пытаются выводиться виндой аки 2 символа. FAR как-то умудряется это обойти.В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить. Чудеса случаются! И вот они: я вывел широкий символ по координатам 10;10 скажем. А затем пишу в место 11;10 другой символ, а мне говорит ОС - фиг вам! И выводит его в 12;10 !!! Т.е. она запомнила, что место занято широким и ни в какую туда ничего другое не суёт. Тварь. (простите за ругательство). Как быть??? |
Сообщ.
#17
,
|
|
|
Сообщ.
#18
,
|
|
|
Цитата Qraizer @ GNU Unifont GlyphsВ общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить. Прикреплённая картинка
Добавлено Цитата Славян @ Ты что-то путаешь. Все эти регионы обычные, суррогатные пары лежат в D800-DFFF. Не в шрифте суть, а в том, что то кодовое место КАЧЕСТВЕННО зарезервировано консорциумом уникода за широкими символами. Добавлено Стоп, ты под широкими понимаешь визуальный размер по горизонтали, что ли? Секундочку, как ты себе представляешь подобное в моноширинной консоли? Добавлено И эта, скриншот FARа покажи, что ли. Аж заинтриговал. |
Сообщ.
#19
,
|
|
|
Цитата Qraizer @ GNU Unifont Glyphs Супер!!! Да и сам шрифт порадовал) |
Сообщ.
#20
,
|
|
|
Цитата Qraizer Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов.ты под широкими понимаешь визуальный размер по горизонтали, что ли? Цитата Qraizer Просто. Два места отводят под символы двойной ширины. Всё выглядит логично.Секундочку, как ты себе представляешь подобное в моноширинной консоли? Цитата Qraizer Какая часть интересна? А! понял. Минутку... И эта, скриншот FARа покажи, что ли. Добавлено Цитата JoeUser Да, есть такая корявая особенность у корявых шрифтов-FAR'ов. Супер!!! Да и сам шрифт порадовал) |
Сообщ.
#21
,
|
|
|
Сообщ.
#22
,
|
|
|
Цитата Славян @ Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов. |
Сообщ.
#23
,
|
|
|
Цитата Славян @ Эм-м... Во-первых, не двойная, а-таки широкая, у пропорциональных шрифтов понятия ширины как таковой нет, она варьируется от символа к символу. Во-вторых, тогда что же не так? Попросил вдвое шире – дали. Не? Да. И это не только я так понимаю, это и весь мир так определил. Двойная ширина у таких спец-символов. |
Сообщ.
#24
,
|
|
|
Цитата Qraizer Да, вы правы. Несколько загнул я.Во-первых, не двойная, а-таки широкая, у пропорциональных шрифтов понятия ширины как таковой нет, она варьируется от символа к символу. Цитата Qraizer Хотелось, чтобы как у FAR'а был вывод: один символ - одно место. Но не получается. Во-вторых, тогда что же не так? Попросил – дали. Не? |