2010-05-19 103 views
20

Tôi đã tự hỏi liệu có phương pháp 'chéo' Windows và Linux được đề xuất cho mục đích chuyển đổi chuỗi từ UTF-16LE sang UTF-8 không? hoặc một nên sử dụng các phương pháp khác nhau cho mỗi môi trường?Chuyển đổi UTF-16 sang UTF-8 trong Windows và Linux, trong C

Tôi đã quản lý để google tham chiếu đến 'iconv', nhưng đối với somreason tôi không thể tìm thấy mẫu chuyển đổi cơ bản, chẳng hạn như - chuyển đổi wchar_t UTF-16 thành UTF-8.

Bất kỳ ai cũng có thể đề xuất một phương pháp 'chéo' và nếu bạn biết tài liệu tham khảo hoặc hướng dẫn với mẫu, sẽ rất đánh giá cao.

Cảm ơn, Doori Bar

+0

Xem câu hỏi trước này: http://stackoverflow.com/questions/148403/utf8-to-from-wide-char-conversion-in- stl –

+0

Cảm ơn Mark, nhưng tôi e rằng nó quá thấp đối với tôi. – DooriBar

Trả lời

0

Thanks guys, đây là cách tôi quản lý để giải quyết các cửa sổ 'chéo' và yêu cầu linux:

  1. Downloaded và cài đặt: MinGW, và MSYS
  2. Downloaded gói libiconv nguồn
  3. Biên soạn libiconv qua MSYS.

Về điều đó.

5

Các mã nguồn mở ICU library được sử dụng rất phổ biến.

3
wchar_t *src = ...; 
int srclen = ...; 
char *dst = ...; 
int dstlen = ...; 
iconv_t conv = iconv_open("UTF-8", "UTF-16"); 
iconv(conv, (char*)&src, &srclen, &dst, &dstlen); 
iconv_close(conv); 
+1

Tôi cho rằng "UTF-16" và "UTF-8" nên chuyển địa điểm. – DooriBar

+0

Bắt tốt ..... –

2

Ngoài ra còn có utfcpp, là thư viện chỉ dành cho tiêu đề.

3

tôi đã chạy vào vấn đề này quá, tôi giải quyết nó bằng cách sử dụng boost locale library

try 
{   
    std::string utf8 = boost::locale::conv::utf_to_utf<char, short>(
         (short*)wcontent.c_str(), 
         (short*)(wcontent.c_str() + wcontent.length())); 
    content = boost::locale::conv::from_utf(utf8, "ISO-8859-1"); 
} 
catch (boost::locale::conv::conversion_error e) 
{ 
    std::cout << "Fail to convert from UTF-8 to " << toEncoding << "!" << std::endl; 
    break; 
} 

Các boost :: locale :: conv :: utf_to_utf chức năng cố gắng để chuyển đổi từ một bộ đệm đó được mã hóa bởi UTF- 16LE to UTF-8, Tăng cường chức năng: :: locale :: conv :: from_utf cố gắng chuyển đổi từ bộ đệm được mã hóa theo UTF-8 thành ANSI, đảm bảo mã hóa là đúng (Ở đây tôi sử dụng mã hóa cho tiếng Latin- 1, ISO-8859-1).

Một lời nhắc khác là, trong Linux std :: wstring dài 4 byte, nhưng trong Windows std :: wstring dài 2 byte, vì vậy bạn nên sử dụng std :: wstring để chứa bộ đệm UTF-16LE.

6

Thay đổi mã hóa sang UTF-8 với PowerShell:

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt" 
+0

Hoạt động tốt trên Windows 2008 R2. BOM cũng được thêm vào. –