UTF-32 コードポイントのシーケンスとして UTF-8 ファイルを読み取る必要があります。例えば:
std::shared_ptr<FILE> f(fopen(filename, "r"), fclose);
uint32_t c = 0;
while (utf8_read(f.get(), c))
{
if (is_english_char(c))
...
else if (is_cjk_char(c))
...
else
...
}
utf8_read
署名がある場所:
bool utf8_read(FILE *f, uint32_t &c);
これutf8_read
で、最初のバイトの値に応じて 1 ~ 4 バイトを読み取ることができます。アルゴリズムについてはhttp://en.wikipedia.org/wiki/UTF-8 、google を参照するか、既に利用可能なライブラリ関数を使用してください。
UTF-32 コードポイントを使用して、範囲を確認できるようになりました。英語の場合、それが ASCII ( c < 0x7F
) であるか、Latin
文字であるかを確認できます (フランス語などからインポートされた単語のアクセント付き文字のサポートを含む)。また、印刷できない制御文字 ( など) を除外することもできます0x01
。
Latin
および/またはCJK
文字チェックでは、文字が特定のコード ブロックに含まれているかどうかを確認できます (コードポイントの範囲については、http://www.unicode.org/Public/UNIDATA/Blocks.txt を参照してください) 。これが最も簡単な方法です。
スクリプト検出機能を備えた Unicode サポート付きのライブラリ (glib ライブラリなど) を使用している場合は、スクリプト タイプを使用して文字を検出できます。または、 http://www.unicode.org/Public/UNIDATA/Scripts.txtからデータを取得できます。
Name : Code : Language(s)
=========:===========:========================================================
Common : Zyyy : general punctuation / symbol characters
Latin : Latn : Latin languages (English, German, French, Spanish, ...)
Han : Hans/Hant : Chinese characters (Chinese, Japanese)
Hiragana : Hira : Japanese
Katakana : Kana : Japanese
Hangul : Hang : Korean
注: スクリプト コードはhttp://www.iana.org/assignments/language-subtag-registry ( Type == 'script'
) から取得されます。