반응형
현재 UTF-8이 통일을 하고 있는 추세이다.
WEB도 거의 표준이고 나머지 공개소프트웨어들도 대부분 기본적으로 UTF8을 사용한다.
그러면 우리는 딱히 공부할 필요가 없다.
그러나 현실은 꼭 그렇지만 않다. UTF16도 있고 CP949도 있고 다양하게 많다.
그중에 하나가 원도우다. 마이크로소프트는 그들이 가지고 있는 강력한 지워권을 통해서 반기들 들고 있다.
그래서 우리가 사용하는 원도우 시스템과 통신을 하거나 전달 할때는 다른것도 공부해야 하는것이다.
아두이노 보드에서 원도우 컴퓨터의 아두이노 시리얼모니터로 한글을 보낼때,
둘다 UTF8이기 때문에 한글이 잘 출력된다.
그러면
아두이노 보드에서 원도우 컴퓨터의 다른 소프트웨어로 보낸다고 할때 잘 출력된다는 보장은 없다.
그소프트웨어가 UFT8을 사용한다면 잘되겠지만, 원도우에서 흔희 사용하는 UFT16을 사용한다면 한글은 정상적으로 출력되지 않는다.
그러면 어떻게 해야 할까?
아두이노에서 UTF8을 변환해서 UFT16으로 보내는 방법도 있다.
이 방법은 물론 알아야 하는 방법이지만 좋지는 않다.
아두이노의 느린 성능에서 변환까지 해서 보낸다면 고성능 CPU를 가진 컴퓨터가 웃을일이다.
그렇다 아두이노는 그냥 보내고 컴퓨터에서 변환 하면 된다.
어쨰던 두가지 모두 공부하기 바란다.
void setup()
{
Serial.begin (9600);
}
void loop()
{
char str1[100];
char str2[100];
strcpy(str1 ,"Hello world!\r\n");
strcpy(str2 ,"대한민국");
SerialprintUTF16(str1);
SerialprintUTF16(str2);
//Serial.write((char*)str2, strlen(str2));
delay (1000);
}
void SerialprintUTF16(char* str)
{
for(int i=0; i< strlen(str); i++)
{
char c = str[i];
if( 0 == (str[i] & 0x80) )
{
Serial.write(str[i]);
}
else if( 0xE0 == (str[i] & 0xE0) &&0x80 == (str[i+1]&0xC0) && 0x80 == (str[i+2]&0xC0) )
{
uint16_t uni0,uni1,uni2,uni;
uni = 0x0000;
uni += (((uint8_t)str[i] & (uint8_t)0x1F) << 12);
uni += (((uint8_t)str[i+1] & (uint8_t)0x3F) << 6);
uni += (((uint8_t)str[i+2] & (uint8_t)0x3F) << 0);
Serial.write((char*)&uni, 2);
i+=2;
}
else if( 0xC0 == (str[i] & 0xE0) &&0x80 == (str[i+1] & 0xC0) )
{
uint16_t uni0,uni1,uni;
uni0 = (str[i] & 0x1F) << 6;
uni1 = (str[i+1] & 0x3F) << 0;
uni = uni0 | uni1;
i+=1;
Serial.write((char*)&uni, 2);
}
}
return ;
}
|
'아두이노' 카테고리의 다른 글
아두이노와 한글 -#4 (0) | 2020.10.24 |
---|---|
아두이노와 한글 -#3 (0) | 2020.10.19 |
아두이노와 한글 -#1 (0) | 2020.10.19 |
아두이노와 미분방정식 (0) | 2020.10.08 |
아두이노와 가변인자 #3 (0) | 2020.09.29 |
댓글