#include <stdio.h>
#include <string.h>
#include <windows.h>
int main() {
system("chcp 65001");
while (1) {
unsigned char s;
scanf("%s", s);
int i = -1;
while (s[++i] != 0);
printf("%d\n", i);
}
}
디폴트 문자셋인
system("chcp 949");
로 바꾸면 한글 2바이트 잘만나옴
왜 utf 8로 바꾸니 1바이트 나오는거냐 3이 나와야하는데
저거 s 단일문자가 아니라 크기 10 배열인데 짤린거
영문자 1개 입력하면 1 나오는게 맞는거 같음. utf-8 은 가변길이 인코딩임. 그리고 유니코드라는게 뭐냐면, 전세계 문자 하나하나 마다 유일한 코드값을 부여한데 유니코드임. 예로 "가"라는 글자의 유니코드는 16진수로 ac00 임. U+AC00 임. 0xac00 이렇게 2바이트 숫자(uint16_t)로 표현하면 UCS2 라고 부름 - dc App
0x0000ac00 4바이트 uint32_t 로 표현하면 UCS4 라고 함. 근데 UTF-8 방식은 가변길이 인코딩임. 아스키 문자는 1바이트로 표현하고 한글의 경우...2바이트에서 3바이트 나오던가.... 그러면 0xac00 0xac01 ... 이런식으로 한글 글자가 11172개 있는데 UTF-8 로 표현하며 바이트 중간에 0 값이 - dc App
있을 수 있겠지? 그러면 strlen 이런걸로 길이 구하면 한글 글자 갯수가 안 나옴. - dc App
근데 UTF-8 로 변환하면 데이터 바이트에 0 값이 존재할지 존재하지 않을지는 실제로 해보지 않아 모르겠다... 궁금하면 utf-8 인코딩 방법을 찾아보셈 - dc App
"가" 를 UTF-16 으로 인코딩하면 0xac 0x00 이렇게 될거 같은데 문자열 끝에 NULL 문자 고려하면 3바이트 배열 char str[3] 에 저장한다고 하면 str[0] 에 0xac00, str[1] 에 0x00, str[2] 에 '\0' 이렇게 저장될 거 같은데...? 0x00 이 0 이고, '\0' 이 0 임. - dc App
그래서 strlen(str) 하면 1나옴. - dc App
utf-16 으로 입력받았을지도 모르겠다고 생각했었는데
https://stackoverflow.com/questions/10882277/properly-print-utf8-characters-in-windows-console
- dc App
utf-8 스트링 중간에 0 이 오지는 않는거 같다. MS윈도우 콘솔에 문제가 있나보다. - dc App