>

ANSI to 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;
}

  • 답변 # 1

    설계 상, 하단 127자는 ASCII/ANSI와 UTF-8 사이에서 이진 호환 가능합니다. 차이가 없어야합니다.

    UTF-8의 바이트 스트림은 고유하므로 "엔디안"문제를 처리 할 필요가 없기 때문에 UTF-8 파일 컨텐츠에 BOM (Byte Order Marker)을 포함하지 않아야합니다. 또한 BOM을 추가하면 ANSI를 허용하는 일부 응용 프로그램이 중단 될 수 있습니다.

  • 답변 # 2

    Windows에서는 ANSI에서 UTF16으로 변환 한 다음 UTF16에서 UTF8로 변환 할 수 있습니다.

    한 번에 1 바이트 씩 문자 세트를 변환 할 수 없습니다. 전체 파일을 버퍼로 읽어서 변환해야합니다. 각 유니 코드 코드 포인트는 UTF8에서 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;
    }
    
    

  • 이전 일단 변환 된 TypeScript의 선언 된 (내 보낸 것이 아닌) 모듈의 열거 형에 액세스
  • 다음 java - Akka 원격 메시지 비용?