2013-05-07 57 views
0

如何使用UTF16LE编码写入现有的文件?我已经使用fopen(file, "a");但是产生的文件将是这样的:将文本追加到现有的UTF16LE文件

<?xml version="1.0" encoding="UTF-16" standalone="yes"?> 㰼㱤㱯㱣㰾㰊㰼㱰㱡㱧㱥㰠㱮㱡㱭㱥㰽㰢㱎㱏㱒㱍㱁㱌㰢㰾㰊㰼㱦㱩㱥㱬㱤㰠㱮㱡㱭㱥㰽㰢㱉㱤㱥㱮㱴㱩㱦㱩㱣㱡㱴㱩㱯㱮㸢㱔㱃㰳㰶㰰㰴㰰㰱㰭㰭㰭㰭㰱㰲㰷㰼㰯㱦㱩㱥㱬㱤㰾㰊㰼㱦㱩㱥㱬㱤㰠㱮㱡㱭㱥㰽㰢㱔㱲㱡㱣㱥㱡㱢㱩㱬㱩㱴㱹㸢㰱㰳㱖㱖㱖㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰭㰰㰰㰼㰯㱦㱩㱥㱬㱤㰾㰊㰼㱦㱩㱥㱬㱤㰠㱮㱡㱭㱥㰽㰢㱄㱥㱳㱣㱲㱩㱰㱴㱩㱯㱮㸢㱄㱥㱳㱣㱲㱩㱰㱴㱩㱯㱮㰀㰼㰯㱦㱩㱥㱬㱤㰾㰊㰼㰯㱰㱡㱧㱥㰾㰊㰼㰯㱤㱯㱣㰾㰊

我不知道我怎么可以追加2个字节的字符到这个文件。

+0

“打印2个字节字符” 那是什么?一个16位wchar_t还是什么? – leonbloy 2013-05-07 17:56:21

回答

1

UTF-16字符不一定是2个字节宽。它可能是2个字节 或4个字节(read up here)。

您已发布最有可能的结果,从追加wchar_t小号直接将文件 怪异的输出,产生UTF-16字符是 正确的相反字节顺序,而这些UTF-16字符骗了在UTF-16范围的 “东方”高度。

从您与GCC在Linux上工作, 您可以使用iconv库通过包括<inconv.h>导入 字符编码转换API你的问题的标签假设。这里是一个样本程序 该wchar_t数组转换:

L'A',L'P',L'P',L'E',L'N',L'D',L'A',L'G',L'E' // "APPENDAGE" 

为UTF-16LE和追加结果到文件“tdata.txt”。它在转换后的输出长度上硬编码 64字节的限制。

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

#define MAXOUT 64 

int main(void) 
{ 
    wchar_t appendage [] = { 
     L'A',L'P',L'P',L'E',L'N',L'D',L'A',L'G',L'E' 
    }; 
    wchar_t * inp = appendage; 
    char converted[MAXOUT]; 
    char * outp = converted; 
    size_t remain_in = sizeof(appendage); 
    size_t remain_out = MAXOUT; 
    size_t conversions; 
    size_t written; 
    char const *tfile = "../tdata.txt"; 
    // Create the right converter from wchar_t to UTF-16LE 
    iconv_t iconvdesc = iconv_open("UTF-16LE","WCHAR_T"); 
    if (iconvdesc == (iconv_t) -1) { 
     perror("error: conversion from wchar_t to UTF-16LE is not available"); 
     exit(EXIT_FAILURE); 
    } 
    FILE * fp = fopen(tfile,"a"); 
    if (!fp) { 
     fprintf(stderr,"error: cannot open \"%s\" for append\n",tfile,stderr); 
     perror(NULL); 
     exit(EXIT_FAILURE); 
    } 

    // Do the conversion. 
    conversions = 
    iconv(iconvdesc, (char **)&inp, &remain_in, (char **)&outp, &remain_out); 
    if (conversions == (size_t)-1) { 
     perror("error: iconv() failed"); 
     exit(EXIT_FAILURE); 
    } 
    assert(remain_in == 0); 
    // Write the UTF-16LE 
    written = fwrite(converted,1,MAXOUT - remain_out,fp); 
    assert(written == MAXOUT - remain_out); 
    fclose(fp); 
    iconv_close(iconvdesc); 
    exit(EXIT_SUCCESS); 
} 

对于GCC,wchar_t是4个字节宽,因此足够宽任何UTF-16。对于 微软的编译器它是2字节宽。

<iconv.h>

文档是here