非 ASCII 文字を含む UTF-8 文字列を sprintf() のような C 標準ライブラリの書式設定関数で処理するときに、興味深い問題を発見しました。
printf() ファミリの関数は utf-8 を認識せず、char ではなくバイト数に基づいてすべてを処理します。したがって、フォーマットが正しくありません。
簡単な例:
#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() などを使用することを推奨する人もいるでしょうが、既存のアプリケーションが巨大であるため、それは絶対に不可能です。これらの関数を内部で使用するラッパーを作成することは想像できますが、これは扱いにくく、非常に非効率的です。
したがって、最善の解決策は、標準 C ライブラリの書式設定関数を UTF-8 対応に置き換えることです。
現在、私は QNX 6.4 に取り組んでいますが、他のオペレーティング システムにも対応しています。Linux なども大歓迎です。