Как можно указать x11 имена шрифтов, чтобы включить печать каких-либо символов UTF-8?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Как можно указать x11 имена шрифтов, чтобы включить печать каких-либо символов UTF-8?

Сообщение Anonymous »

В настоящее время я пытаюсь создать окно окна сообщений (только метка) на Linux, используя Nuklear и его x11 Back-End. В его API используется nk_xfont_create () для создания шрифта, который, в свою очередь, вызывает xcreatefontset () с указанным именем набора шрифта. Он работает нормально, в то время как текст содержит только символы латинской 1, так что английский напечатан как предполагаемый. Но когда дело доходит до других языков, таких как испанский, и особенно языки с другими системами письма, таких как русский или японский, вообще нет печати. Если я укажу другое имя шрифта, например, -jis-fixed-medium-r-normal-*-*-*-*-*-*-jisx0208.1983-0 , xcreatefontset () сообщает об отсутствующем шрифте ISO8859-1 в своих параметрах возврата. И если я укажу несколько имен шрифтов (разделенные запятыми), чести только один, который определяет ISO8859-1, в то время как другие игнорируются, даже если строка для печати в окне сообщения UTF-8 кодируется и содержит слова на нескольких языках. Похоже, что X11 заинтересован только в ISO8859-1 и ничего другого, независимо от того, какие локалы или шрифты установлены на машине. Этот нуклеарный демонстрационный пример, по-видимому, не настроил x11 должным образом для UTF-8 (похоже, он никогда не предназначен). < /P>
Я зарегистрировался на Ubuntu 20.04, сконструированной на английском и других языках, но проблема все еще сохраняется. Причина, по -видимому, не заключается в том, что какие -либо шрифты, не имеющие на машине; Все это больше похоже на то, что X11 не используется или неправильно настроен. Также я не мог выяснить, возможно ли смешивание шрифтов из нескольких наборов шрифтов (возможно (

Код: Выделить всё

-misc-fixed-medium-r-normal--*-*-*-*-*-*-iso8859-5< /code> в любом случае содержит кириллические символы, поэтому, по крайней мере, российский язык в любом случае должен отображаться, но есть только пустое пространство).  < /p>
Пример - три файла, предоставленные Nuklear (фиксированная версия 4.12.4): < /p>
[list]
[*]nuklear.h
,
[*]

Код: Выделить всё

nuklear_xlib.h
,
[*], который я изменил, чтобы нарисовать окно сообщений и немного текста:
[/list]

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include [*]
#include 
#include 
#include 
#include 

#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_IMPLEMENTATION
#define NK_XLIB_IMPLEMENTATION
#include "nuklear.h"
#include "nuklear_xlib.h"

// Window
#define WINDOW_DEFAULT_WIDTH 420
// Text
#define TEXT_TOP_BORDER      24
#define TEXT_BOTTOM_BORDER   24
#define TEXT_LEFT_BORDER     10
#define TEXT_RIGHT_BORDER    10
#define TEXT_LINE_HEIGHT     20
#define TEXT_DISTANCE        4
// Buttons
#define BUTTON_TOP_BORDER    10
#define BUTTON_BOTTOM_BORDER 10
#define BUTTON_LEFT_BORDER   10
#define BUTTON_RIGHT_BORDER  10
#define BUTTON_SPACING       10
#define BUTTON_FIXED_WIDTH   72
#define BUTTON_FIXED_HEIGHT  20
// Window minimal height (without title bar)
#define WINDOW_MIN_HEIGHT \
(TEXT_TOP_BORDER + TEXT_LINE_HEIGHT + TEXT_BOTTOM_BORDER + \
BUTTON_TOP_BORDER + BUTTON_FIXED_HEIGHT + BUTTON_BOTTOM_BORDER)

#define DTIME           20
#define WINDOW_WIDTH    800
#define WINDOW_HEIGHT   600

typedef struct XWindow XWindow;
struct XWindow {
Display *dpy;
Window root;
Visual *vis;
Colormap cmap;
XWindowAttributes attr;
XSetWindowAttributes swa;
Window win;
int screen;
XFont *font;
unsigned int width;
unsigned int height;
Atom wm_delete_window;
};

static void
die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputs("\n", stderr);
exit(EXIT_FAILURE);
}

static long
timestamp(void)
{
struct timeval tv;
if (gettimeofday(&tv, NULL) < 0) return 0;
return (long)((long)tv.tv_sec * 1000 + (long)tv.tv_usec/1000);
}

static void
sleep_for(long t)
{
struct timespec req;
const time_t sec = (int)(t/1000);
const long ms = t - (sec * 1000);
req.tv_sec = sec;
req.tv_nsec = ms * 1000000L;
while(-1 == nanosleep(&req, &req));
}

static void elide(const XFont* font, const char** lines)
{
// TBD
(void)font;
(void)lines;
}

int
main(void)
{
long dt;
long started;
int running = 1;
XWindow xw;
struct nk_context *ctx;

#define TEXT_ENG "Hello, world!"
#define TEXT_ESP /*"¡Hola Mundo!"*/ "Hola, Mundo del español!"
#define TEXT_RUS "Привет, мир!"
#define TEXT_JAP "こんにちは世界!"

const char* text[] = {
/*"ENG: "*/ TEXT_ENG " (ENG)",
/*"ESP: "*/ TEXT_ESP " (ESP)",
/*"RUS: "*/ TEXT_RUS " (RUS)",
/*"JAP: "*/ TEXT_JAP " (JAP)",
};

/* X11 */
memset(&xw, 0, sizeof xw);
xw.dpy = XOpenDisplay(NULL);
if (!xw.dpy) die("Could not open a display; perhaps $DISPLAY is not set?");
xw.root = DefaultRootWindow(xw.dpy);
xw.screen = XDefaultScreen(xw.dpy);
xw.vis = XDefaultVisual(xw.dpy, xw.screen);
xw.cmap = XCreateColormap(xw.dpy,xw.root,xw.vis,AllocNone);

xw.swa.colormap = xw.cmap;
xw.swa.event_mask =
ExposureMask | KeyPressMask | KeyReleaseMask |
ButtonPress | ButtonReleaseMask| ButtonMotionMask |
Button1MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask|
PointerMotionMask | KeymapStateMask;

const char* fontName = "fixed";

xw.font = nk_xfont_create(xw.dpy, fontName);
if (xw.font == NULL)
printf("nk_xfont_create() returned null font!\n");
int width = WINDOW_DEFAULT_WIDTH;
int height = WINDOW_MIN_HEIGHT;
elide(xw.font, text);
for (size_t i = 0; i < sizeof(text)/sizeof(text[0]);  ++i)
height += TEXT_DISTANCE + TEXT_LINE_HEIGHT;

xw.win = XCreateWindow(xw.dpy, xw.root, 0, 0, width, height, 0,
XDefaultDepth(xw.dpy, xw.screen), InputOutput,
xw.vis, CWEventMask | CWColormap, &xw.swa);

XStoreName(xw.dpy, xw.win, "X11");
XMapWindow(xw.dpy, xw.win);
xw.wm_delete_window = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wm_delete_window, 1);
XGetWindowAttributes(xw.dpy, xw.win, &xw.attr);
xw.width = (unsigned int)xw.attr.width;
xw.height = (unsigned int)xw.attr.height;

ctx = nk_xlib_init(xw.font, xw.dpy, xw.screen, xw.win, xw.width, xw.height);

struct nk_style_window* style = &ctx->style.window;
style->spacing.x = 0;
style->spacing.y = 0;
style->padding.x = 0;
style->padding.y = 0;
//style->background = nk_rgba(255, 0, 255, 255);
int dw = style->scrollbar_size.x; // width delta

while (running)
{
/* Input */
XEvent evt;
started = timestamp();
nk_input_begin(ctx);
while (XPending(xw.dpy)) {
XNextEvent(xw.dpy, &evt);
if (evt.type == ClientMessage) goto cleanup;
if (XFilterEvent(&evt, xw.win)) continue;
nk_xlib_handle_event(xw.dpy, xw.screen, xw.win, &evt);
}
nk_input_end(ctx);

/* GUI */
if (nk_begin(ctx, "Demo", nk_rect(0, 0, width + dw, height),
0))
{
// Text area top indent
nk_layout_row_begin(ctx, NK_STATIC, TEXT_TOP_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);

// Number of buttons (currently only "OK")
int number = 1;

// Text area text labels (several lines are possible)
for (size_t i = 0; i < sizeof(text)/sizeof(text[0]);  ++i)
{
const char* line = text[i];

nk_layout_row_begin(ctx, NK_STATIC, TEXT_LINE_HEIGHT, 3);
nk_layout_row_push(ctx, TEXT_LEFT_BORDER);
nk_spacer(ctx);
nk_layout_row_push(ctx,
width - TEXT_LEFT_BORDER -
TEXT_RIGHT_BORDER);
nk_label(ctx, line, NK_TEXT_LEFT);
//nk_label_wrap(ctx, line);
nk_layout_row_push(ctx, TEXT_RIGHT_BORDER);
nk_spacer(ctx);
nk_layout_row_end(ctx);

nk_layout_row_begin(ctx, NK_STATIC, TEXT_DISTANCE, 1);
nk_spacer(ctx);
nk_layout_row_end(ctx);
}

// Text area bottom indent
nk_layout_row_begin(ctx, NK_STATIC, TEXT_BOTTOM_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);

// Button area top indent
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_TOP_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);

// Preparing for the OK button
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_FIXED_HEIGHT,
(number + 1) * 2);
nk_layout_row_push(ctx, BUTTON_LEFT_BORDER);
nk_spacer(ctx);
nk_layout_row_push(ctx, (width -
BUTTON_LEFT_BORDER -
BUTTON_FIXED_WIDTH * number -
BUTTON_SPACING * (number - 1) -
BUTTON_RIGHT_BORDER));
nk_spacer(ctx);
// OK button
{
nk_layout_row_push(ctx, BUTTON_FIXED_WIDTH);
if (nk_button_label(ctx, "OK"))
{
// Do nothing yet
}
}
nk_layout_row_push(ctx, BUTTON_RIGHT_BORDER);
nk_spacer(ctx);
nk_layout_row_end(ctx);

// Button area bottom indent
nk_layout_row_begin(ctx, NK_STATIC, BUTTON_BOTTOM_BORDER, 1);
nk_layout_row_push(ctx, width);
nk_spacer(ctx);
nk_layout_row_end(ctx);
}
nk_end(ctx);
//        if (nk_window_is_hidden(ctx, "MyMessageBox")) break;

/* Draw */
XClearWindow(xw.dpy, xw.win);
nk_xlib_render(xw.win, nk_rgb(45,45,45));
XFlush(xw.dpy);

/* Timing */
dt = timestamp() - started;
if (dt < DTIME)
sleep_for(DTIME - dt);
}

cleanup:
nk_xfont_del(xw.dpy, xw.font);
nk_xlib_shutdown();
XUnmapWindow(xw.dpy, xw.win);
XFreeColormap(xw.dpy, xw.cmap);
XDestroyWindow(xw.dpy, xw.win);
XCloseDisplay(xw.dpy);
return 0;
}
< /code>
Я пробовал эти шрифты: < /p>
[list]
"IPAexGothic"
(для японского) - установлено на моей машине, но Nuklear Prints "Отсутствует шрифт: ISO8859-1";
[*]

Код: Выделить всё

"-misc-fixed-medium-r-normal--*-*-*-*-*-*-iso8859-5"
(для русского) - кажется, на самом деле использует только версию ISO8859-1, без печати;
[*]

Код: Выделить всё

"-jis-fixed-medium-r-normal--*-*-*-*-*-*-jisx0208.1983-0"
(для японского) - также не помогает.
[/list]
Как я могу узнать, что не так? Я особенно заинтересован в X11, так что использование другой структуры (или другой нуклеарной задней части) не вариант.

Подробнее здесь: https://stackoverflow.com/questions/797 ... characters
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как можно указать x11 имена шрифтов, чтобы включить печать каких-либо символов UTF-8?
    Anonymous » » в форуме Linux
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Получить ввод utf-8 с отображением X11 для всех окон
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Получить ввод utf-8 с отображением X11 для всех окон
    Anonymous » » в форуме Linux
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Отключить/включить управление в X11/xlib
    Anonymous » » в форуме Linux
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • MacOS: вес шрифтов из определенного семейства шрифтов не отображается должным образом в браузере/не загружается должным
    Anonymous » » в форуме CSS
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»