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
「打印2個字節字符」 那是什麼?一個16位wchar_t還是什麼? – leonbloy 2013-05-07 17:56:21