2009-05-21 12 views
16

Tôi đang cố gắng viết mã nền tảng i18n C++. Vì hầu hết hệ thống Linux thích sử dụng UTF-8 như mã hóa ký tự, tôi nghĩ rằng tôi nên sử dụng chuỗi trên linux và wstring trên Windows. Là tchar.h có sẵn trên Linux? Một thay thế tương đương trên cho tchar.h trên Linux là gì?tchar.h trên linux

Trả lời

11

Bạn có thể tìm thấy bài viết this hữu ích. Đặc biệt, gần cuối cùng, họ thảo luận một chút về việc sử dụng TCHAR và xử lý mã Windows.

Các tóm tắt bài viết là:

TCHAR sẽ được dịch sang một kiểu dữ liệu nhân vật rộng khi biên dịch mã này với GNU C Compiler (hầu hết các thư viện di động xác định TCHAR trong tiêu đề của họ và tham khảo wchar_t). Điều này, trên thực tế, là làm thế nào tôi chuyển chương trình C++ của tôi thành một máy phát điện anagram: Tôi đã sử dụng các chuỗi C++ chuẩn chứa UTF-8 và cung cấp dữ liệu với con trỏ được gán cho hàm wchar_t vào thư viện. Dữ liệu UTF-8 được hiểu là UTF-32 tương đương với rác (nhưng nó rất hữu ích cho việc làm xáo trộn dữ liệu và lỗi).

+4

Để rõ ràng, tchar.h chỉ dành cho Windows. Nhưng nó khá tầm thường để cuộn tchar.h của riêng bạn. – Naaff

0

Thực sự không dễ dàng như vậy. string.size() sẽ cung cấp cho bạn số byte UTF-8, không phải ký tự Unicode. Trong tất cả sự công bằng, wstring.size() sẽ không cung cấp cho bạn số lượng ký tự trong sự có mặt của người thay thế. Nhưng trong thực tế, những người không được sử dụng trong các ứng dụng phổ biến.

Vì vậy, câu trả lời thực sự phụ thuộc vào lý do bạn cần chuỗi Unicode. Chỉ là bản địa hóa giao diện người dùng? Bạn có đầu vào của người dùng không? Bạn có cần phân tích đầu vào đó không?

0

Để xây dựng nguồn trung tâm Windows của tôi, tôi đã có thể sử dụng tệp tchar.h từ tệp Cygwin được tìm thấy trong thư mục cygwin \ usr \ include \ w32api.

Tôi đang thực sự xây dựng bằng cách sử dụng NDK của Android. Vì mục đích của tôi, tôi đã tạo một bản sao của tchar.h và vá nó.

//#include <crtdefs.h> 

#define _CRTIMP 

//#define _strninc(_pc,_sz) (((_pc)+(_sz))) 
// _CRTIMP size_t __cdecl __strncnt(const char *_Str,size_t _Cnt);