2010-10-11 244 views
2

任何人都可以提供一個簡單的例子來讀寫Unicode文件中的一個Unicode字符嗎?Unicode文件寫入和C++讀取?

+4

什麼格式? UTF-8,UTF-16或UTF-32? – 2010-10-11 10:18:23

+2

如果UTF-16是3種可能的UTF-16格式中的哪一種?大端,小端,還是由BOM指定? – 2010-10-11 10:22:38

+1

而且,在哪個平臺上? 'wchar_t'的大小並不是相同的:在Windows上,通常在UTF-16 LE內部存儲字符串,而在UTF-8(帶有'char')或UTF-32('wchar_t')的Linux上。 – 2010-10-11 10:40:27

回答

1

在linux上,我使用非常標準的iconv (link)庫。一個過於簡單的程序是:

#include <stdio.h> 
#include <stdlib.h> 
#include <iconv.h> 

#define BUF_SZ 1024 
int main(int argc, char* argv[]) 
{ 
    char bin[BUF_SZ]; 
    char bout[BUF_SZ]; 
    char* inp; 
    char* outp; 
    ssize_t bytes_in; 
    size_t bytes_out; 
    size_t conv_res; 
    if(argc != 3) 
    { 
     fprintf(stderr, "usage: convert from to\n"); 
     return 1; 
    } 
    iconv_t conv = iconv_open(argv[2], argv[1]); 
    if(conv == (iconv_t)(-1)) 
    { 
     fprintf(stderr, "Cannot conver from %s to %s\n", argv[1], argv[2]); 
     return 1; 
    } 

    bytes_in = read(0, bin, BUF_SZ); 
    { 
     bytes_out = BUF_SZ; 
     inp = bin; 
     outp = bout; 
     conv_res = iconv(conv, &inp, &bytes_in, &outp, &bytes_out); 
     if(conv_res >= 0) 
     { 
      write(1, bout, (size_t)(BUF_SZ) - bytes_out); 
     } 
    } 
    iconv_close(conv); 
    return 0; 
} 

這是過於簡單的演示轉換。在現實世界中,你通常有兩個嵌套的循環:

  • 一個讀數輸入,所以處理時,其超過BUF_SZ
  • 一個轉換輸入到輸出。請記住,如果要從ASCII轉換爲UTF-32LE,則每個iunput字節最終都要輸出4個字節。因此,內部循環將通過檢查conv_res然後檢查errno來處理此問題。