2011-01-16 36 views
10

Tôi đang cố gắng để thêm wchar_t ký tự Unicode để một ncurses hiển thị trong C.Thêm ký tự Unicode/UTF8 để một ncurses hiển thị trong C

Tôi có một mảng:

wchar_t characters[]={L'\uE030', L'\uE029'}; // containing 2 thai letters, for example 

Và sau đó tôi cố gắng để thêm một wchar_t từ mảng đến ncurses hiển thị với:

add_wch(characters[0]); 

để cung cấp thông tin hơn một chút, làm điều này với ASCII công trình ok, sử dụng:

char characters[]={'A', 'B'}; 

// and later... 

addch(characters[0]); 

Để thiết lập miền địa phương, tôi thêm bao gồm ...

#include <locale.h> 

// in main() 
setlocale(LC_CTYPE,"C-UTF-8"); 

Các ncurses bao gồm là:

#include <ncurses.h> 

Biên soạn với:

(chỉnh sửa: thêm c99 tiêu chuẩn, để hỗ trợ tên char phổ quát.)

gcc -o ncursesutf8 ncursesutf8.c -lm -lncurses -Wall -std=c99 

tôi nhận được biên soạn sau đây cảnh báo (tất nhiên thực thi sẽ thất bại):

ncursesutf8.c:48: warning: implicit declaration of function ‘add_wch’ 

Tôi đã cố gắng chỉ sử dụng addch mà dường như được macro'ed để làm việc với wchar_t nhưng khi tôi làm điều đó các ký tự Unicode không hiển thị, thay vào đó chúng hiển thị dưới dạng ký tự ASCII.

Mọi suy nghĩ?

Tôi đang sử dụng OS X Snow Leopard, 10.6.6

Sửa: lỗi gỡ bỏ trên wchar_t [] gán để sử dụng L'\u0E30' thay vì L"\u0E30", vv Tôi cũng đã cập nhật các thiết lập trình biên dịch sử dụng C99 (để thêm phổ biến hỗ trợ tên char). cả hai thay đổi đều không khắc phục được sự cố.

Vẫn không có câu trả lời nào về điều này, có ai biết cách thực hiện Unicode ncurses addchar (add_wchar?)?! Cứu giúp!

+0

Cũng lưu ý rằng bạn không bao giờ được chuyển bất kỳ chuỗi nào trừ '' '' đến 'setlocale'. Việc chuyển các kết quả '" "' trong việc định vị miền đã được cấu hình/hệ thống, sẽ là UTF-8 dựa trên bất kỳ hệ thống hiện đại nào. Các tên như '" C-UTF-8 "' không di động. –

Trả lời

17

Hỗ trợ ký tự rộng được xử lý bởi ncursesw. Tùy thuộc vào distro của bạn, ncurses có thể hoặc có thể không chỉ có (dường như không phải trong của bạn).

Hãy thử sử dụng -lncursesw thay vì -lncurses.

Ngoài ra, là các địa phương, thử gọi setlocale(LC_ALL, "")

+9

Ngoài ra, lưu ý rằng lệnh gọi 'setlocale' phải đứng trước' initscr() '. – g33kz0r

2

Đây là không 2 nhân vật:

wchar_t characters[]={L"\uE030", L"\uE029"}; 

Bạn đang cố gắng để khởi tạo wchar_t giá trị (số nguyên) với con trỏ, điều này sẽ dẫn đến một lỗi từ trình biên dịch.Hoặc sử dụng:

wchar_t characters[]={L'\uE030', L'\uE029'}; 

hoặc

wchar_t characters[]=L"\uE030\uE029"; 
+0

Cảm ơn mẹo, nhưng điều này không giải quyết được vấn đề, hãy xem các chỉnh sửa của tôi ở trên. Bất kỳ ý tưởng? – ocodo

+0

@R ... bất kỳ cơ hội nào bạn có câu trả lời cho điều này? – ocodo

1

cchar_t được định nghĩa là:

typedef struct { 
    attr_t attr; 
    wchar_t chars[CCHARW_MAX]; 
} cchar_t; 

vì vậy bạn có thể thử:

int add_wchar(int c) 
{ 
    cchar_t t = { 
     0, // .attr 
     {c, 0} // not sure how .chars works, so best guess 
    }; 
    return add_wch(t); 
} 

không phải ở tất cả các thử nghiệm, nhưng nên làm việc .

+0

Tôi sẽ thử, hy vọng bạn cũng đoán;) – ocodo

+0

Vâng, điều đó không hiệu quả, CCHARW_MAX là không xác định, tôi thực sự không biết làm thế nào bạn nghĩ ra điều này, một số lời giải thích sẽ hữu ích. Tôi cũng đã phải thêm cấu trúc 'cchar_t' vào nguồn, theo cách bạn đặt nó, suy ra rằng nó đã được định nghĩa (có lẽ là trong ncurses). – ocodo

+0

Chờ, bạn có * có * add_wch không? Tài liệu của tôi có nó, nhưng nó dường như không được định nghĩa trong ncurses.h của tôi. –

1

Bạn có xác định _XOPEN_SOURCE_EXTENDED trước khi đưa ncurses tiêu đề?

+0

Tôi đã làm điều này trong Lisp thay vì C. :) – ocodo

Các vấn đề liên quan