2009-04-24 33 views
10

Tôi cố gắng để ra những thứ như 안, 蠀, ☃ từ Cunicode hello world cho C?

#include <wchar.h> 
int main() 
{ 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

ra là?,?,?

Làm cách nào để in các ký tự đó?

Edit:

#include <wchar.h> 
#include <locale.h> 
int main() 
{ 
    setlocale(LC_CTYPE, ""); 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

này đã làm các trick. đầu ra là 안, 蠀, ☃. ngoại trừ việc nhân vật người Trung Quốc và người tuyết xuất hiện như một cái hộp trong urxvt của tôi có lẽ vì tôi không kích hoạt những ngôn ngữ đó.

$ locale -a 
C 
en_US 
en_US.iso88591 
en_US.iso885915 
en_US.utf8 
ja_JP.utf8 
ko_KR 
ko_KR.euckr 
ko_KR.utf8 
korean 
korean.euc 
POSIX 
zh_CN.utf8 

ngôn ngữ nào tôi phải bật thêm để nó hiển thị ký tự Trung Quốc và người tuyết? có lẽ tôi cần phông chữ?

chương trình trên có hoạt động trên Windows không?

+0

Bạn đang sử dụng Windows hoặc Linux? – Zifre

+0

chết tiệt, có gì đó không ổn với máy tính của tôi vì tôi cũng thấy những thứ đó? trong mẫu mã! – alvatar

+4

Thử đặt mã hóa thành Unicode (UTF-8) (trong Firefox, Xem-> Mã hóa ký tự) –

Trả lời

1

Bạn phải định cấu hình hệ thống của mình để chấp nhận các ký tự đó. Bạn đang dùng gì? Windows, Linux?

+0

Tôi đang sử dụng Linux. $ locale tất cả được đặt thành en_US.utf8 – numeric

9

Bạn phải đặt thiết bị đầu cuối đầu ra tương thích Unicode.

Trên Linux (với Bash shell), hãy thử:

$ LANG=en.UTF-8 

và cũng chắc chắn rằng giả lập thiết bị đầu cuối của bạn thực sự có thể hiển thị Unicode và được cấu hình để làm như vậy.

4

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

Loại wchar_t là một loại riêng biệt có giá trị có thể đại diện cho mã riêng biệt cho tất cả các thành viên của bộ ký tự mở rộng lớn nhất định giữa các miền địa phương được hỗ trợ (22.1.1). [...]

Sự khác biệt giữa ký tự nhiều byte và wchar_t:

ký tự nhiều byte có thể đòi hỏi nhiều hơn một byte cho một nhân vật được tùy thuộc vào mã hóa (ví dụ: UTF-8, UTF- 16)

trong khi

wchar_t có kích thước cố định tức là siz eof (wchar_t) được thực hiện xác định. Lưu ý rằng chiều rộng này xác định (các) mã hóa nào mà bạn wchar_t có thể hỗ trợ. Vì vậy, nếu sizeof(wchar_t) == 2 không có cách nào bạn có thể sử dụng mã hóa UTF-32.

Cũng nhớ rằng wchar_t không có ý nghĩa mã hóa. Trước tiên, bạn phải thông báo cho trình biên dịch về loại mã hóa mà nó phải sử dụng cho dữ liệu wchar_t. Đầu ra sai lầm có lẽ là do các ký tự đang được xử lý trong mã hóa mặc định mà không thể hỗ trợ các ký tự đó đúng cách và kết quả khớp không thành công dẫn đến kiểu 'notdef'? ' đầu ra.

+0

wchar_t không nhất thiết là đa byte - có thể dài một byte. –

+0

Vâng vâng, tôi đáng lẽ phải có nhiều hơn nữa :-) – dirkgently

6

Có nhiều giai đoạn riêng lẻ trong quá trình nhận đầu ra Unicode - tất cả đều phải được định cấu hình chính xác.

Trước tiên, bạn có đang biên dịch hỗ trợ unicode được bật không? bạn sẽ cần phải làm như vậy trong Windows (-D UNICODE -D __UNICODE).

Thứ hai, bạn có phát ra dòng lệnh hỗ trợ unicode, cả về nguyên tắc nhưng cũng có phông chữ chứa ký tự đại diện của các ký tự bạn đang phát ra?

Thứ ba, thực hiện mã hóa unicode được trình biên dịch của bạn sử dụng và khớp lệnh của bạn? nó không sử dụng UCS2 trong nhị phân của bạn khi dòng lệnh của bạn mong đợi UTF8.

Bạn về cơ bản cần phải hiểu Unicode và các mã hóa của nó, để có được quyền này. Đừng tưởng tượng nó đơn giản hoặc bạn không cần phải tìm hiểu tất cả các khái niệm cơ bản; công cụ này không hoạt động do tai nạn vì có quá nhiều thứ phải chính xác.

0

Giống như Alnitak đề xuất, người ta phải chỉ định một ngôn ngữ có bộ ký tự/mã hóa bao gồm các ký tự bạn muốn hiển thị. (Unicode /) UTF-8 phải bao gồm tất cả các ký tự Unicode.

Thiết bị đầu cuối của bạn nên sử dụng phông chữ có glyph tương ứng.

CMD'EXE của Windows rất yếu khi nói đến bộ ký tự vượt quá 8 bit. Có lẽ, bạn cần một cửa sổ GUI thay vì dựa vào stdout.