Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 输出与输入相同。如何修复?_C_Utf 8_Character Encoding - Fatal编程技术网

C 输出与输入相同。如何修复?

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

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("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的正式定义)不支持这些字母。