Я обнаружил интересную проблему при обработке строк UTF-8, содержащих символы не-ASCII, с функциями форматирования стандартной библиотеки C, такими как sprintf ():
Функции семейства printf () не знают о utf-8 и обрабатывают все, основываясь на количестве байтов, а не символов. Поэтому форматирование неверно.
Простой пример:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char* testMsg = "Tääääßt";
char buf[1024];
int len;
sprintf(buf, "|%7.7s|", testMsg);
len = strlen(buf);
printf("Result=\"%s\", len=%d", buf, len);
return 0;
}
Результат:
Result="|Täää|", len=7
Скорее всего, некоторые из вас порекомендуют преобразовать приложение из char в wchar_t и использовать fwprintf () и т. Д., Но это абсолютно невозможно из-за огромных существующих приложений. Я мог бы представить написание оболочки, которая использует эти функции внутри, но это было бы сложно и очень неэффективно.
Таким образом, наилучшим решением будет замена с поддержкой UTF-8 функций форматирования стандартной библиотеки С.
В настоящее время я работаю над QNX 6.4, но отвечаю за другие операционные системы. например Linux, также очень приветствуются.