nim_duilib/tool_kits/shared/pin_yin_helper.cpp

150 lines
3.2 KiB
C++
Raw Normal View History

2019-04-19 17:19:57 +08:00
#include "stdafx.h"
#include "pin_yin_helper.h"
#include "shared/tool.h"
using namespace nbase;
using namespace shared;
#define HANZI_MIN 0x4E00
#define HANZI_MAX 0x9FA5
unsigned int pyrange[][3] = {
{0xB0A1, 0xB0C4, 'a'},
{0xB0C5, 0xB2C0, 'b'},
{0xB2C1, 0xB4ED, 'c'},
{0xB4EE, 0xB6E9, 'd'},
{0xB6EA, 0xB7A1, 'e'},
{0xB7A2, 0xB8C0, 'f'},
{0xB8C1, 0xB9FD, 'g'},
{0xB9FE, 0xBBF6, 'h'},
{0xBBF7, 0xBFA5, 'j'},
{0xBFA6, 0xC0AB, 'k'},
{0xC0AC, 0xC2E7, 'l'},
{0xC2E8, 0xC4C2, 'm'},
{0xC4C3, 0xC5B5, 'n'},
{0xC5B6, 0xC5BD, 'o'},
{0xC5BE, 0xC6D9, 'p'},
{0xC6DA, 0xC8BA, 'q'},
{0xC8BB, 0xC8F5, 'r'},
{0xC8F6, 0xCBF9, 's'},
{0xCBFA, 0xCDD9, 't'},
{0xCDDA, 0xCEF3, 'w'},
{0xCEF4, 0xD1B8, 'x'},
{0xD1B9, 0xD4D0, 'y'},
{0xD4D1, 0xD7F9, 'z'}
};
const wchar_t kFileName[] = L"translation.bin";
PinYinHelper::PinYinHelper() : file_handle_(nullptr), code_index_(nullptr), pinyin_(nullptr)
{
LoadPinyinTable();
}
PinYinHelper::~PinYinHelper()
{
}
const char* PinYinHelper::ConvertToSimpleSpell(const std::wstring& chinese)
{
if (chinese.empty() || !code_index_.get() || !pinyin_.get())
{
return "";
}
str_firstLetters_.clear();
for (std::wstring::size_type i = 0; i < chinese.length(); i++)
{
wchar_t ch = chinese[i];
const char *pinyin_char = NULL;
if(ch >= HANZI_MIN && ch <= HANZI_MAX)
{
pinyin_char = pinyin_.get() + code_index_[ch - HANZI_MIN];
str_firstLetters_ += pinyin_char[0];
}
else
{
str_firstLetters_.push_back((char)ch);
}
}
return str_firstLetters_.c_str();
}
std::wstring PinYinHelper::GetPinyinFilePath()
{
std::wstring full_path;
std::wstring path = nbase::win32::GetCurrentModuleDirectory();
full_path = path + kFileName;
return full_path;
}
bool PinYinHelper::LoadPinyinTable()
{
if (code_index_.get() && pinyin_.get())
return true;
std::wstring path = GetPinyinFilePath();
file_handle_.reset(nbase::OpenFile(path, L"rb"));
if (!file_handle_)
{
//LOG_ERR("Open translator file error!");
return false;
}
int hanzi_num = 0;
int pinyin_size = 0;
fread(&hanzi_num, 4, 1, file_handle_.get());
fread(&pinyin_size, 4, 1, file_handle_.get());
code_index_.reset(new int[4 * hanzi_num]);
if (!code_index_.get())
{
//LOG_ERR("code_index_ New memory error!");
return false;
}
pinyin_.reset(new char[pinyin_size]);
if (!pinyin_.get())
{
//LOG_ERR("pinyin_ New memory error!");
return false;
}
int ret;
ret = fread(code_index_.get(), 4, hanzi_num, file_handle_.get());
if (ret != hanzi_num)
{
//LOG_ERR("code_index_ Read file error!");
return false;
}
ret = fread(pinyin_.get(), 1, pinyin_size, file_handle_.get());
if (ret != pinyin_size)
{
//LOG_ERR("pinyin_ Read file error!");
return false;
}
return true;
}
const char* PinYinHelper::ConvertToFullSpell(const std::wstring& chinese)
{
if (chinese.empty() || !code_index_.get() || !pinyin_.get())
{
return "";
}
str_pinyin_.clear();
for(unsigned int i = 0; i < chinese.length(); i++)
{
wchar_t ch = chinese[i];
const char *pinyin_char = NULL;
if(ch >= HANZI_MIN && ch <= HANZI_MAX)
{
pinyin_char = pinyin_.get() + code_index_[ch - HANZI_MIN];
str_pinyin_.append(pinyin_char);
}
else
{
str_pinyin_.push_back((char)ch);
}
}
return str_pinyin_.c_str();
}