Skip to content

Instantly share code, notes, and snippets.

@JackyYin
Last active September 3, 2021 09:04
Show Gist options
  • Save JackyYin/f9a7b824d1a2a8a633d94754d62deb54 to your computer and use it in GitHub Desktop.
Save JackyYin/f9a7b824d1a2a8a633d94754d62deb54 to your computer and use it in GitHub Desktop.
in-place replace bad UTF-8 chars for CLD2
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