文字列 (または) が UTF-8 でエンコードされている可能性があるかどうかを識別する最良の方法は何ですか? ここでは、 Win32 APIIsTextUnicode
はあまり役に立ちません。また、文字列には UTF-8 BOM がないため、チェックできません。そして、はい、ASCII 範囲を超える文字のみが 1 バイト以上でエンコードされることを知っています。
9 に答える
FireFox で使用される Mozilla によって開発されたchardet文字セット検出。ソースコード
jchardetは、mozilla の自動文字セット検出アルゴリズムからのソースの Java ポートです。
NCharDetは、Mozilla および FireFox ブラウザーで使用される C++ の Java ポートの .Net (C#) ポートです。
文字エンコード検出にMicrosoft のMLangを使用するコード プロジェクト C#サンプル。
UTRACは、文字列エンコーディングを検出するために C++ で記述されたコマンド ライン ツールおよびライブラリです。
cpdetectorは、エンコード検出に使用される Java プロジェクトです。
chsdetは Delphi プロジェクトであり、特定のテキストまたはファイルの自動文字セット/エンコーディング検出用のスタンドアロンの実行可能モジュールです。
文字エンコーディングを決定するのに役立つ多くのライブラリを指す別の便利な投稿http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html
関連する質問「BOM (バイト オーダー マーク) が見つからない場合にエンコーディングを推測するにはどうすればよいですか?」を参照することもできます。、それはいくつかの有用なコンテンツを持っています。
本当に信頼できる方法はありませんが、基本的に、バイトのランダムなシーケンス (たとえば、標準の 8 ビット エンコーディングの文字列) が有効な UTF-8 文字列である可能性は非常に低いためです (バイトの最上位ビットが設定されている場合、 UTF-8 でどの種類のバイトがそれに続くことができるかについては非常に具体的な規則があります)、文字列を UTF-8 としてデコードしてみて、デコード エラーがない場合は UTF-8 であると見なすことができます。
デコード エラーがあったかどうかを判断することは、まったく別の問題です。多くの Unicode ライブラリは、エラーが発生したかどうかを示すことなく、単に無効な文字を疑問符に置き換えます。したがって、デコード中にエラーが発生したかどうかを判断する明示的な方法が必要です。
この W3C ページには、UTF-8 を検証するための perl 正規表現があります。
Win32 の場合、mlang API を使用できます。これは Windows の一部であり、Windows XP からサポートされています。これの優れた点は、入力が特定のエンコーディングである可能性に関する統計を提供することです。
CComPtr<IMultiLanguage2> lang;
HRESULT hr = lang.CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER);
char* str = "abc"; // EF BB BF 61 62 63
int size = 6;
DetectEncodingInfo encodings[100];
int encodingsCount = 100;
hr = lang->DetectInputCodepage(MLDETECTCP_NONE, 0, str, &size, &encodings, &encodingsCount);
Ruby で文字検出を行うには、「chardet」gem をインストールします。
sudo gem install chardet
標準入力ストリームで chardet を実行する小さな Ruby スクリプトを次に示します。
require "rubygems"
require 'UniversalDetector' #chardet gem
infile = $stdin.read()
p UniversalDetector::chardet(infile)
Chardet は、文字セット エンコーディングの推測と、統計分析からの信頼レベル (0-1) を出力します。
Mozilla の文字セット検出器に基づく C/C++ スタンドアロン ライブラリ
https://github.com/batterseapower/libcharsetdetect
Universal Character Set Detector (UCSD) Mozilla C++ UCSD ライブラリへの C インターフェイスと依存関係のないインターフェイスを公開するライブラリ。このライブラリは、一部の入力テキストのエンコードに使用される文字セットを決定しようとする非常に正確な一連のヒューリスティックを提供します。これは、エンコーディング メタデータなしで提供された入力ファイルをプログラムが処理する必要がある場合に非常に便利です。
言語を指定しませんでしたが、PHP で使用できますmb_check_encoding
if(mb_check_encoding($yourDtring, 'UTF-8'))
{
//the string is UTF-8
}
else
{
//string is not UTF-8
}
MultiByteToWideChar()
Windows では、CP_UTF8
コードページとMB_ERR_INVALID_CHARS
フラグを使用できます。関数が失敗した場合、文字列は有効な UTF-8 ではありません。