닌자고양이
[C/C++] UTF-8 텍스트 파일 읽는 방법들 본문
C++ 로케일 설정 후 wifstream 으로 읽기
#include <fstream>
#include <string>
using namespace std;
int main()
{
locale::global(locale(".UTF-8"));
wifstream f(L"text.txt");
wstring wstr;
f >> wstr;
}
fopen 의 파일 모드 옵션에 인코딩 타입 지정해 읽기 (ccs=UNICODE 또는 UTF-8 또는 UTF-16LE)
#include <stdio.h>
int main(void)
{
wchar_t buf[10000];
FILE* f = fopen("text.txt", "rt+,ccs=UTF-8");
fwscanf(f, L"%ls", buf); // scanf 포맷으로 읽기
fgetws(buf, 1000, f); // 한 줄 읽기 (gets w버전)
}
- 유니코드 인코딩 사용시 w버전의 I/O함수를 사용해야 한다. 윈도우의 경우 와이드 문자열에 UTF-16LE 인코딩을 사용하므로 UTF-16LE 파일을 읽을 때 내부적으로 변환 과정이 생략되어 속도가 빠르다. 리눅스는 와이드 문자열이 UTF-32LE 이므로 항상 변환이 발생한다.
- 윈도우(VC++)는 UTF-8, UTF-16LE(=UNICODE)를 지원하고 파일에 BOM 존재시 BOM에 지정된 인코딩을 사용한다.
- 리눅스(G++)는 UTF-8만 지원하며 BOM을 인식하지 못한다.
_setmode 로 파일 모드를 설정해 읽기 (윈도우 및 일부 OS만 지원. io.h, fcntl.h 필요)
_O_BINARY, _O_TEXT, _O_WTEXT, _O_U16TEXT, _O_U8TEXT 등
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main(void)
{
wchar_t buf[10000];
FILE* f = fopen("text.txt", "rt+");
_setmode(_fileno(f), _O_U8TEXT); // UTF-8 인코딩으로 설정
fwscanf(f, L"%ls", buf); // scanf 포맷으로 읽기
fgetws(buf, 1000, f); // 한 줄 읽기 (gets w버전)
}
'C C++' 카테고리의 다른 글
[C/C++] 문자열 분리 (strpbrk, strtok, find_first_of 사용) (0) | 2020.10.03 |
---|---|
[C++] ifstream 으로 텍스트 파일 읽는 방법들 (0) | 2020.09.20 |
[C/C++] 중간값 구하기 mid(a, b, c) (0) | 2020.09.09 |
[C/C++] 공백으로 구분된 정수 배열 입력 받기 (split) (0) | 2020.01.20 |
[C/C++] 콘솔에 확장 아스키 문자 출력 (0) | 2019.12.04 |
Comments