投稿

1月, 2026の投稿を表示しています

Visual Studio 2022 C++ IMultiLanguage2のマルチスレッド化メモ

はじめに BF(butterfly search)で必要な機能の一つに文字コード判定機能があります。 BFでは、IMultiLanguage2::DetectInputCodepageを使用しています。 リリース当時、判別方法はこれしかなかった記憶があります。文字コードの誤判定もかなりありますが仕方なくこれを採用。 近年のBF修正方針としては、CPUとメモリはあるだけ使用していく。18年前とは環境が違います。 マルチスレッド非対応 IMultiLanguage2はマルチスレッドに対応していないという問題があります。 BF動作中に確認してみると32中30スレッドがDetectInputCodepageで待ち合わせしていました。 これは許容できません。 代わりのマルチスレッドに対応したAPIを紹介して欲しいとチャッピーにお願いすると、 uchardet(https://github.com/BYVoid/uchardet)を紹介されました。 uchardetはもともとMozillaによって開発されたエンコード検出ライブラリで、「EmEditor」が従来備えていた処理よりも精度が改善されているということでよい事尽くしだと。 チャッピーまとめ まとめるとチャッピーの回答は以下です。 ・IMultiLanguage2::DetectInputCodepage → uchardet::uchardet_get_charset を使え。 ・IMultiLanguage2::ConvertStringToUnicodeEx → MultiByteToWideChart を使え。 ・読み込ませる範囲は先頭部分だけでよい。  最終的な修正 最終的な修正は下記になりました。 ・IMultiLanguage2::DetectInputCodepage → 初めにuchardet::uchardet_get_charsetを使用し失敗した場合は、IMultiLanguage2::DetectInputCodepageを使う。 ・IMultiLanguage2::ConvertStringToUnicodeEx →初めにMultiByteToWideChartを使いし失敗した場合は、IMultiLanguage2::ConvertStringToUnicodeExを使う。 ・読み込ませる範囲は...