Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.48.135] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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 @ В общем, думаю, надо для начала поискать универсальный юникодовый шрифт и попробовать его установить. Говорят, что это самый полный по языкам. |