[mecab-devel 109] Re: ウインドウズ用バイナリーパッケージでインストールした際の文字セットについて

Back to archive index
Sae miyab****@yd6*****
2021年 5月 8日 (土) 10:21:47 JST


こんにちは その後分かったことなどのご報告します。


 前回のメールの一部訂正

 >//    if (( model = mecab_model_new2( "-u C:\\Program Files 
(x86)\\MeCab\\dic\\ipadic\\fantasy.dic" )) == NULL )

 この部分をコメント外しても別のエラーになります。ごめんなさい。

+        m_pszData    "viterbi.cpp(50) [tokenizer_->open(param)] 
tokenizer.cpp(127) [d->open(dicfile[i])] dictionary.cpp(79) 
[dmmap_->open(file, mode)] no such file or directory: C:\Program "    
wchar_t *

     static char *ppArgv[] = { "", "-u", "C:\\Program Files 
(x86)\\MeCab\\dic\\Fantasy\\fantasy.dic", 0, 0 };

     if (( model = mecab_model_new( 3, ppArgv )) == NULL )

 こちらで辞書のパスが正しくわたります。が、文字セットが違うといわれます。

+        m_pszData    "viterbi.cpp(50) [tokenizer_->open(param)] 
tokenizer.cpp(130) [sysdic->isCompatible(*d)] incompatible dictionary: 
C:\Program Files (x86)\MeCab\dic\Fantasy\fantasy.dic "    wchar_t *

 libmecabをVisualStudioでx64debugビルドして、ある程度中身を追いかけられるように

なりました。エラーになる箇所は

   CHECK_FALSE(sysdic->open
                     (create_filename(prefix, SYS_DIC_FILE).c_str()))
       << sysdic->what();
この部分で、create_filenameへの引数は
+        prefix    "C:\Program Files (x86)\MeCab\etc\..\dic\ipadic" 
std::basic_string<char,std::char_traits<char>,std::allocator<char> >
#define SYS_DIC_FILE            "sys.dic"

 実際にcreate_filename側で観てみると

std::string create_filename(const std::string &path,

                             const std::string &file) {
   std::string s = path;

+        path    "タケ,゙・"    const 
std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
+        file    "C:\Program Files (x86)\MeCab\etc\..\dic\ipadic"    
const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &

 Path,fileがずれているように観えました。最終的に

      libmecab.dll!MeCab::decode_charset(const char * charset)  行 80    C++
int decode_charset(const char *charset) {
   std::string tmp = charset;
   toLower(&tmp);
   if (tmp == "sjis"  || tmp == "shift-jis" ||
       tmp == "shift_jis" || tmp == "cp932")
     return CP932;

decode_charsetに入った際の引数は

+        charset    0x0000000008e7f260 ""    const char *

となり、なぜか std::string tmp = charset; 
の行で"utf-8"に初期化されているようでした。

事前にsys.dicの文字セットは 
"shift-jis"と認識していました。ソースの場所コピルの忘れました。

? std::basic_string<char,std::char_traits<char>,std::allocator<char> 
 >::substr が返されました。    "config-charset" 
std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+        key    "config-charset" 
std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+        line    "config-charset = SHIFT-JIS" 
std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+        this    0x000000000880f140 {conf_=[15](...) 
rest_=[-2972253](...) system_name_="" ...}    MeCab::Param * const
+        value    "SHIFT-JIS" 
std::basic_string<char,std::char_traits<char>,std::allocator<char> >

 libmecabのビルドはX64指定で行いましたが、アドレスやリファレンス渡しの引数の

Bit数が違う?のかずれるのが原因のようです。どうすれば良いのかわからなくなりました。

 何かご存じの方いらっしゃいませんか? よろしくお願いします。


まさえ



Mecab-devel メーリングリストの案内
Back to archive index