홈>
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
- 답변 # 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; }
관련 자료
- python - 동일한 출력을 계산하는 방법은 무엇입니까?
- mobile - 앱 Android에서 adb 출력을 얻는 방법은 무엇입니까?
- java - 이미지를 JSP의 출력으로 보내는 방법
- Java 암호화에서 입력 키가 16 바이트가 아닌 경우 키를 채우는 방법은 무엇입니까?
- html - 마우스 오버시 하위 메뉴 컨테이너를 표시하려면 어떻게해야합니까?
- python - y 축을 반대쪽으로 그리는 방법은 무엇입니까?
- 설정으로 내 PHP 버전의 설정을 어떻게 볼 수 있습니까?
- c++ - GrammarFst의 가중치를 어떻게 편집 할 수 있습니까?
- python - 플롯을 올바르게 배치하는 방법
- python - 출력에 사용자 입력 대신 변수가 표시되는 이유는 무엇입니까?
- python - Powershell에서 Pip3은 Pip과 동일합니다
- r - 각 ID에 대해 하나의 레코드를 가질 수 있도록 df를 재구성하는 방법
- postgresql - 앱의 채팅 부분을 구성하는 방법을 속속 화 하시겠습니까?
- shell - 동일한 명령 실행
- python - 한 셀 Jupyter Lab에서 텍스트의 글꼴 크기를 변경하는 방법은 무엇입니까?
- arrays - C에서 동일한 양의 데이터가 아닌 경우 Scanf
- python 3.x - 쿼리에서 열 이름을 얻는 방법은 무엇입니까?
- regex - 패턴 입력을 한 번만 사용하는 방법은 무엇입니까?
- python - 점 사이에 선을 연결하는 방법
- javascript - 화면에 경고가있는 텍스트를 복사하는 방법
설계 상, 하단 127자는 ASCII/ANSI와 UTF-8 사이에서 이진 호환 가능합니다. 차이가 없어야합니다.
UTF-8의 바이트 스트림은 고유하므로 "엔디안"문제를 처리 할 필요가 없기 때문에 UTF-8 파일 컨텐츠에 BOM (Byte Order Marker)을 포함하지 않아야합니다. 또한 BOM을 추가하면 ANSI를 허용하는 일부 응용 프로그램이 중단 될 수 있습니다.