yanyiwu / cppjieba

"结巴"中文分词的C++版本
MIT License
2.57k stars 690 forks source link

能应用在qt上么?我vs调试没问题,但是放在qt中就出现错误 #135

Open Sakura0818 opened 4 years ago

Sakura0818 commented 4 years ago

2019-09-30 17:50:31 ..\untitled\cppjieba/DictTrie.hpp:156 FATAL exp: [ifs.is_open()] false. open ../dict/jieba.dict.utf8 failed.

没有进行到分词,再第一个路径加载jieba函数位置就报错了,希望指点一下

lioyou commented 4 years ago

@Sakura0818 win10 qt5.9 cppjieba5.0.0 完全可用,你这个应该是文件路径问题,将jieba.dict.utf8的路径,改成绝对路径。

TangMonk commented 4 years ago

@Sakura0818 win10 qt5.9 cppjieba5.0.0 完全可用,你这个应该是文件路径问题,将jieba.dict.utf8的路径,改成绝对路径。

你们用的VS多少版本的,我用VS2019编译很多报错,mingw倒是能编译成功,但是demo.exe跑不起来

lioyou commented 4 years ago

我有安装VS2019社区版,但是编译我用的是mingw,32与64都可以编译,运行也没有问题。 跑不起来,什么错误?没有的话,Debug,设断点看那里中断了!

TangMonk commented 4 years ago

我有安装VS2019社区版,但是编译我用的是mingw,32与64都可以编译,运行也没有问题。 跑不起来,什么错误?没有的话,Debug,设断点看那里中断了!

你VS2019能编译吗

lioyou commented 4 years ago

没有试过,因为没有将VS放到环境变量中,QT没有检测到编译套件,也没有一定要用VS这个需求,所以没有配置过(知道怎么配置)!

TangMonk commented 4 years ago

没有试过,因为没有将VS放到环境变量中,QT没有检测到编译套件,也没有一定要用VS这个需求,所以没有配置过(知道怎么配置)!

我在demo.cpp的main函数的第一行随便打印了一句话:

int main(int argc, char** argv) {

  string ss = "他来到了网易杭研大厦";
  cout << ss << endl;

  cppjieba::Jieba jieba(DICT_PATH,

编译后执行是乱码:

.\demo.exe
浠栨潵鍒颁簡缃戞槗鏉爺澶у帵

我先去gdb试试,你能告诉我vs怎么配置吗

lioyou commented 4 years ago

编码格式问题,如果你文件编码是UTF8,终端只显示GBK的话,那么就是乱码 你可以打包【搜QT打包】后,使用别的终端进行测试,如Git,可以设置编码格式的,换成UTF8 或者CMD,使用命令chcp 65001,改成UTF8,应该能正确显示了,之后改回来chcp 936,这个是GBK QT 编译器配置,你搜一下,

TangMonk commented 4 years ago

chcp 65001

chcp 65001确实可以了,谢谢

TangMonk commented 4 years ago

编码格式问题,如果你文件编码是UTF8,终端只显示GBK的话,那么就是乱码 你可以打包【搜QT打包】后,使用别的终端进行测试,如Git,可以设置编码格式的,换成UTF8 或者CMD,使用命令chcp 65001,改成UTF8,应该能正确显示了,之后改回来chcp 936,这个是GBK QT 编译器配置,你搜一下,

dgb试了下,运行到

cppjieba::Jieba jieba(DICT_PATH,
        HMM_PATH,
        USER_DICT_PATH,
        IDF_PATH,
        STOP_WORD_PATH);

这里就退出了,可能是词库的PATH有问题,我再看看

lioyou commented 4 years ago

1 下载库,其实编不编译无所谓,毕竟只需要头文件

2 cppjieba库需要用到limonp库,有的编译器提示找不到,直接将deps/limonp拷贝放到cppjieba目录下

3 词库文件路径

使用QT,我开发的是图形界面程序

3.1 头文件:MainWindow.hpp

直接引入#include "d:/lio/include/cppjieba/jieba.hpp" // jieba 是成员变量,是头文件中声明:
`cppjieba::Jieba* jieba
;` // 最后在源文件中的析构函数中delete jieba_;

3.2 直接在MainWindow.cpp文件中,声明全局变量,如下:

const char* const DICT_PATH = "D:/lio/dependency/cppjieba-5.0.0/dict/jieba.dict.utf8";
const char* const HMM_PATH = "D:/lio//dependency/cppjieba-5.0.0/dict/hmm_model.utf8";
const char* const USER_DICT_PATH = "D:/lio//dependency/cppjieba-5.0.0/dict/user.dict.utf8";
const char* const IDF_PATH = "D:/lio//dependency/cppjieba-5.0.0/dict/idf.utf8";
const char* const STOP_WORD_PATH = "D:/lio//dependency/cppjieba-5.0.0/dict/stop_words.utf8";

3.3 在构构造函数中

     jieba_ = new cppjieba::Jieba(DICT_PATH,
          HMM_PATH,
          USER_DICT_PATH,
          IDF_PATH,
          STOP_WORD_PATH);
stereo720712 commented 3 years ago

chcp 65001

chcp 65001确实可以了,谢谢

剛剛成功在win上測試, 不過有些字元 還是顯示 ?? 能請問一下為什麼嗎?