2012-03-07 40 views
5

Tôi muốn chuyển đổi dữ liệu trong các mã hóa khác thành UTF-8. Tôi bị mắc kẹt với các sự cố sau:Cách sử dụng iconv để chuyển đổi utf8?

  1. Thực thi mã được đính kèm cung cấp cho tôi: pointer being freed was not allocated trong biểu tượngv(). Tại sao biểu tượng chơi với bộ nhớ của tôi?
  2. Khi tôi không rảnh (dst) nó không sụp đổ nhưng không có gì được in. Thậm chí không gibberish. Có gì sai?

void utf8(char **dst, char **src, const char *enc) 
{ 
    iconv_t cd; 
    size_t len_src, 
      len_dst; 

    len_src = strlen(*src); 
    len_dst = len_src * 8; // is that enough for ASCII to UTF8? 

    cd = iconv_open("UTF-8", enc); 

    *dst = (char *)calloc(len_dst+1, 1); 

    iconv(cd, src, &len_src, dst, &len_dst); 
    iconv_close(cd); 
} 

int main(int argc, char **argv) 
{ 
    char *src = "hello world"; 
    char *dst; 

    utf8(&dst, &src, "ASCII"); 
    printf("%s\n", dst); 

    free(dst); 
    return 0; 
} 
+0

Các ký tự FWIW, UTF-8 không bao giờ vượt quá 6 byte mỗi ký tự. 'len_src * 8' là quá mức cần thiết. –

Trả lời

3

Trích từ iconv() description at POSIX.1-2008

size_t iconv(iconv_t cd, char **restrict inbuf, 
     size_t *restrict inbytesleft, char **restrict outbuf, 
     size_t *restrict outbytesleft); 

Biến trỏ đến bởi outbuf sẽ được cập nhật để trỏ đến byte sau byte cuối cùng của dữ liệu đầu ra được chuyển đổi.

Bạn cần lưu và khôi phục *dst (và có thể *src) bên trong chức năng utf8() của bạn.

+0

Thx! Bất kỳ ý tưởng tại sao hàm được viết để sửa đổi các con trỏ? Không giống như một thực hành tốt cho tôi. – ClosedID

+0

Nếu chuyển đổi không hoàn thành, bạn nhận được vị trí (cả đầu vào và đầu ra) mà tại đó chuyển đổi có thể tiếp tục. Nếu hàm đã chấp nhận 'char *' hoặc đã hứa sẽ không thay đổi các đối số, bạn cần chuyển một đối số khác cho loại quản lý đó. Tôi sẽ để mở câu hỏi mà trong đó hai lựa chọn là "tốt hơn" ... – pmg

+0

Tôi đã cố gắng tìm lỗi này trong mã của tôi trong nhiều tuần. Bạn đã cứu tôi. Cảm ơn! –

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