gpt4 book ai didi

c - Linux C 将文件从 `UTF-16LE` 转换为 `ASCII` 代码挂起

转载 作者:行者123 更新时间:2023-11-30 17:39:14 25 4
gpt4 key购买 nike

我尝试使用 iconv 将 UTF-16LE 文本文件转换为 ASCII,但由于某种原因,我的代码永远挂起,知道我做错了什么吗?

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

#define S_SIZE (1024)

#define bool int
#define true 1
#define false 0

int main(){
iconv_t icd;
FILE *fp_src, *fp_dst;
char s_src[S_SIZE], s_dst[S_SIZE];
char *p_src, *p_dst;
size_t n_src, n_dst;

icd = iconv_open("ASCII", "UTF-16LE");
fp_src = fopen("utf8_test.txt", "rb");
fp_dst = fopen("ascii_test.txt", "w");

while(true){
fgets(s_src, S_SIZE, fp_src);
if (feof(fp_src))
break;
p_src = s_src;
p_dst = s_dst;
n_src = strlen(s_src);
n_dst = S_SIZE-1;
while(0 < n_src){
iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
}
*p_dst = '\0';
fputs(s_dst, fp_dst);
}

fclose(fp_dst);
fclose(fp_src);
iconv_close(icd);

return 0;
}

是否是因为 ASCII 文件在 EOF 中终止,而 UTF-16LE 在 WEOF 中终止?

最佳答案

好的,找到了 ICU 库的解决方案。

#include <stdio.h>
#include <stdlib.h>
#include <unicode/ustdio.h>
#include <unicode/uchar.h>

UChar* read_utf8_file(const char* filename, long* size) {
/* open a UTF-8 file for reading */
UFILE* f = u_fopen(filename, "r", NULL, "UTF-16LE");

/* get the file size */
long fsize;
fseek(u_fgetfile(f), 0, SEEK_END);
fsize = ftell(u_fgetfile(f));
u_frewind(f);

/* allocate enough memory to store the whole string plus termination */
UChar* str = (UChar*) malloc(sizeof(UChar) * (fsize + 1));

/* read the string into the allocated space */
for ((*size) = 0; !u_feof(f); ++(*size)) {
str[*size] = u_fgetc(f);
}

/* add NULL termination */
str[*size] = 0;

/* close the file resource */
u_fclose(f);

return str;
}

int main() {
/* read the string and its size */
long size;
UChar* str = read_utf8_file("utf8_test.txt", &size);

/* print the string size */
//printf("String size: %ld\n\n", size);

/* print the UTF-8 string */
UFILE* u_stdout = u_finit(stdout, NULL, NULL);
u_fprintf(u_stdout, "%S\n", str);
u_fclose(u_stdout);

/* free the allocated string */
free(str);

return 0;
}

关于c - Linux C 将文件从 `UTF-16LE` 转换为 `ASCII` 代码挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com