UTF-8 に言及する訳は、バイト列に不正な UTF-8 があると、それがセキュリティ ホールになるかもしれないからです。 UTF-8 は、「最短」エンコードの利用を想定していますので、そのままデコード すると、必要以上に長い文字列をエンコードしたものを受けてしまうかもしれない からです。 実際、初期の規格では「最短」でないエンコードを認めていました。 ここで問題となるのは、複数の方法で危険な入力が行われる可能性があり、その ことによって、危険な入力に対するセキュリティ処理が無になるかもしれないと いうことです。 RFC ではその問題を下記のように記載しています。
この件についてのさらなる論議は Markus Kuhn 氏のサイト http://www.cl.cam.ac.uk/~mgk25/unicode.html にある UTF-8 and Unicode FAQ for Unix/Linux で読めます。
Table 4-1. Legal UTF-8 Sequences
UCS Code (Hex) | Binary UTF-8 Format | Legal UTF-8 Values (Hex) |
---|---|---|
00-7F | 0xxxxxxx | 00-7F |
80-7FF | 110xxxxx 10xxxxxx | C2-DF 80-BF |
800-FFF | 1110xxxx 10xxxxxx 10xxxxxx | E0 A0*-BF 80-BF |
1000-FFFF | 1110xxxx 10xxxxxx 10xxxxxx | E1-EF 80-BF 80-BF |
10000-3FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | F0 90*-BF 80-BF 80-BF |
40000-FFFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | F1-F3 80-BF 80-BF 80-BF |
40000-FFFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | F1-F3 80-BF 80-BF 80-BF |
100000-10FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | F4 80-8F* 80-BF 80-BF |
200000-3FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | too large; see below |
04000000-7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | too large; see below |
この対処は微妙です。 Unicode フォーラムで開発した C による変換ルーチンを調査したいなら、 ftp://ftp.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c を 利用してみてはどうでしょうか。 このルーチンがオープンソースかどうかはっきりしませんので(ライセンスを読んでも、 修正可能かどうかわかりません)、その点は注意してください。