C 输出与输入相同。如何修复?
ANSI到UTF-8转换器。主要问题是输出与输入相同。如何修复它C 输出与输入相同。如何修复?,c,utf-8,character-encoding,C,Utf 8,Character Encoding,ANSI到UTF-8转换器。主要问题是输出与输入相同。如何修复它 #include <windows.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[], char *envp[]) { FILE *SrcFile; FILE *DstFile; char ch; wchar_t wch; if((SrcFile = fopen("inp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *envp[])
{
FILE *SrcFile;
FILE *DstFile;
char ch;
wchar_t wch;
if((SrcFile = fopen("input.txt", "rb")) == NULL)
return 1;
if((DstFile = fopen("output.txt","wb+")) == NULL)
return 1;
fputc(0xFF, DstFile);
fputc(0xFE, DstFile);
while(TRUE)
{
ch = fgetc(SrcFile);
if(feof(SrcFile))
break;
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
&ch, 1, &wch, 1);
fputwc(wch, DstFile);
}
fclose(SrcFile);
fclose(DstFile);
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[],char*envp[]
{
文件*SrcFile;
文件*DstFile;
char ch;
wchar_t wch;
if((SrcFile=fopen(“input.txt”,“rb”))==NULL)
返回1;
如果((DstFile=fopen(“output.txt”,“wb+”)==NULL)
返回1;
fputc(0xFF,DstFile);
fputc(0xFE,DstFile);
while(TRUE)
{
ch=fgetc(SrcFile);
if(feof(SrcFile))
打破
MultiByteToWideChar(CP_ACP,MB_预合成,
&ch,1和wch,1);
fputwc(wch,dst文件);
}
fclose(src文件);
fclose(DstFile);
返回0;
}
根据设计,底部127个字符在ASCII/ANSI和UTF-8之间是二进制兼容的。所以应该没有区别
您不应该在UTF-8文件内容中包含BOM(字节顺序标记),因为它是不必要的,因为UTF-8的字节流是唯一的,因此不需要处理“endian”问题。此外,添加BOM表可能会破坏某些接受ANSI的应用程序。在Windows中,可以从ANSI转换为UTF16,然后从UTF16转换为UTF8 不能在字符集之间一次转换1个字节。整个文件必须读入缓冲区并转换。请注意,在UTF8中,每个Unicode代码点都在1到4个字节之间,而在UTF16中是2或4个字节,在ANSI中总是1个字节
int main(void)
{
FILE* src = fopen("source.txt", "rb");
if(!src) return 0;
FILE* dst = fopen("destination.txt", "wb");
if(!dst) return 0;
fseek(src, 0, SEEK_END);
long filesize = ftell(src);
char *ansi = malloc(filesize);
fseek(src, 0, SEEK_SET);
fread(ansi, 1, filesize, src);
int codepage = CP_ACP;
int u16size = MultiByteToWideChar(codepage, 0, ansi, filesize, NULL, 0);
wchar_t *u16 = malloc(u16size * sizeof(wchar_t));
MultiByteToWideChar(codepage, 0, ansi, filesize, u16, u16size);
int u8size = WideCharToMultiByte(CP_UTF8, 0, u16, u16size, NULL, 0, NULL, FALSE);
char *u8 = malloc(u8size);
WideCharToMultiByte(CP_UTF8, 0, u16, u16size, u8, u8size, NULL, FALSE);
fwrite(u8, 1, u8size, dst);
return 0;
}
如果hte输入为ANSI,则其外观与UTF-8相同。这是故意的。只有在代码点超过127之后,UTF-8才会有所不同。此外,您不应该在UTF-8文件内容中包含BOM(字节顺序标记),因为它是不必要的。您确定
&ch
是\u in_NLS\u string(cbMultiByte)LPCCH
?在我看来,它很像一个char*
。另请参见转换为UTF-16,而不是UTF-8(其中ASCII是一个子集)。您希望得到什么输出?哦,您不需要进行feof
检查。fgetc
函数返回一个int
,如果出现错误或文件结束,该值将为EOF
。因此,您可以在循环条件中直接使用它,而((ch=fgetc(SrcFile))!=EOF){…}
。别忘了将ch
定义为int
。ANSI字符的范围会增加到255个。这是正确的,但在大多数拉丁语文本情况下,实际使用的值保留在底部127,对应于Unicode基本拉丁语。ANSI中较高的代码点通常表示不常见的标点符号、数学符号和重音拉丁字符。如果没有符号,它可以用于拉丁字母表。但对于非拉丁字母,如希腊语、西里尔语、亚洲语言,它将失败……ISO 8859-1(ANSI的正式定义)不支持这些字母。