7

さまざまな文字エンコードの問題は、含まれているファイルが常に明確にマークされているとは限らないことです。「byte-order-markers」またはBOMを使用して一部をマークするための一貫性のない規則があります。しかし、本質的には、ファイルを正確に読み取るために、ファイルのエンコーディングが何であるか 知らされなければなりません。

私たちはソースファイルを読み取るプログラミングツールを構築しますが、これは私たちに悲しみを与えます。デフォルトを指定したり、BOMなどをスニッフィングしたりする手段があります。また、規則やデフォルトをうまく処理できます。しかし、私たち(そして私は他のすべての人)がハングアップする場所は、BOMマークが付いていないUTF-8ファイルです。

最近のMSIDE(VS Studio 2010など)は、ファイルを「スニッフィング」して、BOMなしでUTF-8でエンコードされているかどうかを判断するようです。(ツールビジネスに携わっている私たちは、MSが「愚かな」崖を越えなければならない場合でも、市場シェアがあるため、MSと互換性を持たせたいと考えています。)ヒューリスティック(ヒューリスティックの議論は問題ありませんが)?どうして「正しい」のでしょうか?(このように解釈されたISO8859-xエンコード文字列を検討してください)。

編集:文字エンコード/セットの検出に関するこの論文は非常に興味深いものです: http ://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

2012年12月の編集:ファイル全体のスキャンを終了して、UTF-8シーケンスの違反が含まれているかどうかを確認しました...含まれていない場合は、UTF-8と呼びます。このソリューションの悪い部分は、UTF-8の場合、文字を2回処理する必要があることです。(UTF-8でない場合、ファイルがすべての7ビットASCIIで発生し、その時点でUTF-8のように読み取っても問題がない場合を除いて、このテストでかなり迅速に判断できる可能性があります)。

4

3 に答える 3

8

エンコーディングが UTF-8 の場合、0x7F の上に表示される最初の文字は、UTF-8 シーケンスの開始でなければなりません。そのため、それをテストします。そのために使用するコードは次のとおりです。

unc ::IsUTF8(unc *cpt)
{
    if (!cpt)
        return 0;

    if ((*cpt & 0xF8) == 0xF0) { // start of 4-byte sequence
        if (((*(cpt + 1) & 0xC0) == 0x80)
         && ((*(cpt + 2) & 0xC0) == 0x80)
         && ((*(cpt + 3) & 0xC0) == 0x80))
            return 4;
    }
    else if ((*cpt & 0xF0) == 0xE0) { // start of 3-byte sequence
        if (((*(cpt + 1) & 0xC0) == 0x80)
         && ((*(cpt + 2) & 0xC0) == 0x80))
            return 3;
    }
    else if ((*cpt & 0xE0) == 0xC0) { // start of 2-byte sequence
        if ((*(cpt + 1) & 0xC0) == 0x80)
            return 2;
    }
    return 0;
}

0 が返された場合は、有効な UTF-8 ではありません。それ以外の場合は、返された文字数をスキップし、0x7F を介して次の文字のチェックを続けます。

于 2013-02-16T17:41:23.823 に答える
2

Visual Studio Code では、推測と信頼度を返すjschardetを使用します。すべてオープンソースなので、コードを調べることができます。

https://github.com/microsoft/vscode/issues/101930#issuecomment-655565813

于 2020-12-09T21:13:41.283 に答える
1

基本的に、ファイル/ストリーム/ソースのエンコーディングがわからない場合は、ファイル全体をチェックするか、テキストの一部を探して、UTF-8 に一致するかどうかを確認する必要があります。これは、一部の抗ウイルス製品が行うことと似ており、既知のウイルス部分文字列の一部をチェックしています。

UTF-8エンコーディングが見つかったかどうかを判断するために、ファイル/ストリームを1行ずつ読み取るときに行ったのと同様の関数への呼び出しを適用することをお勧めします

以下の投稿を参照してください

参考文献 - https://stackoverflow.com/questions/17283872/how-to-detect-utf-8-based-encoded-strings

于 2013-06-24T20:46:02.160 に答える