Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

닌자고양이

[C/C++] UTF-8 텍스트 파일 읽는 방법들 본문

C C++

[C/C++] UTF-8 텍스트 파일 읽는 방법들

닌자고양이 2020. 9. 18. 00:34

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버전)
}
Comments