Last active
September 3, 2021 09:04
-
-
Save JackyYin/f9a7b824d1a2a8a633d94754d62deb54 to your computer and use it in GitHub Desktop.
in-place replace bad UTF-8 chars for CLD2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void remove_bad_utf8 (uint8_t *src, size_t srclen) | |
{ | |
uint8_t *dst = src; | |
uint8_t *srcend = src + srclen; | |
while (src < srcend) { | |
// 0xxxxxxx | |
if ((src[0] & 0x80) == 0x00) { | |
if (src[0] < 0x20 || src[0] == 0x7F) { | |
/* printf("not printable one-byte char...%02X\n", src[0]); */ | |
dst[0] = ' '; | |
dst += 1; | |
} else { | |
dst[0] = src[0]; | |
dst += 1; | |
} | |
src += 1; | |
} | |
// 110xxxxx 10xxxxxx | |
else if ( | |
(src + 1 < srcend) && | |
((src[0] & 0xE0) == 0xC0) && | |
((src[1] & 0xC0) == 0x80) | |
) { | |
// 0xC280 ~ 0xC29F | |
if (src[0] == 0xC2 && ((src[1] & 0xE0) == 0x80)) { | |
/* printf("not printable two-byte char...\n"); */ | |
dst[0] = ' '; | |
dst += 1; | |
} else { | |
dst[0] = src[0]; | |
dst[1] = src[1]; | |
dst += 2; | |
} | |
src += 2; | |
} | |
// 1110xxxx 10xxxxxx 10xxxxxx | |
else if ( | |
(src + 2 < srcend) && | |
((src[0] & 0xF0) == 0xE0) && | |
((src[1] & 0xC0) == 0x80) && | |
((src[2] & 0xC0) == 0x80) | |
) { | |
if ( | |
src[0] == 0xED && | |
( | |
(src[1] == 0xA0 && src[2] == 0x80) || | |
(src[1] == 0xAD && src[2] == 0xBF) || | |
(src[1] == 0xAE && src[2] == 0x80) || | |
(src[1] == 0xAF && src[2] == 0xBF) || | |
(src[1] == 0xB0 && src[2] == 0x80) || | |
(src[1] == 0xBF && src[2] == 0xBF) | |
) | |
) { | |
/* printf("not printable three-byte char...\n"); */ | |
dst[0] = ' '; | |
dst += 1; | |
} else { | |
dst[0] = src[0]; | |
dst[1] = src[1]; | |
dst[2] = src[2]; | |
dst += 3; | |
} | |
src += 3; | |
} | |
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | |
else if ( | |
(src + 3 < srcend) && | |
((src[0] & 0xF8) == 0xF0) && | |
((src[1] & 0xC0) == 0x80) && | |
((src[2] & 0xC0) == 0x80) && | |
((src[3] & 0xC0) == 0x80) | |
) { | |
dst[0] = src[0]; | |
dst[1] = src[1]; | |
dst[2] = src[2]; | |
dst[3] = src[3]; | |
src += 4; | |
dst += 4; | |
} | |
// 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | |
else if ( | |
(src + 4 < srcend) && | |
((src[0] & 0xFC) == 0xF8) && | |
((src[1] & 0xC0) == 0x80) && | |
((src[2] & 0xC0) == 0x80) && | |
((src[3] & 0xC0) == 0x80) && | |
((src[4] & 0xC0) == 0x80) | |
) { | |
dst[0] = src[0]; | |
dst[1] = src[1]; | |
dst[2] = src[2]; | |
dst[3] = src[3]; | |
dst[4] = src[4]; | |
src += 5; | |
dst += 5; | |
} | |
// 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | |
else if ( | |
(src + 5 < srcend) && | |
((src[0] & 0xFE) == 0xFC) && | |
((src[1] & 0xC0) == 0x80) && | |
((src[2] & 0xC0) == 0x80) && | |
((src[3] & 0xC0) == 0x80) && | |
((src[4] & 0xC0) == 0x80) && | |
((src[5] & 0xC0) == 0x80) | |
) { | |
dst[0] = src[0]; | |
dst[1] = src[1]; | |
dst[2] = src[2]; | |
dst[3] = src[3]; | |
dst[4] = src[4]; | |
dst[5] = src[5]; | |
src += 6; | |
dst += 6; | |
} | |
else { | |
dst[0] = src[0]; | |
dst++; | |
src++; | |
} | |
} | |
dst[0] = '\0'; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment