Closed osfans closed 8 years ago
嗯,標準字符集(比如gb2312)試驗成功了:
diff --git a/src/gear/charset_filter.cc b/src/gear/charset_filter.cc
index edf3a90..b8072dc 100644
--- a/src/gear/charset_filter.cc
+++ b/src/gear/charset_filter.cc
@@ -12,6 +12,7 @@
#include <rime/engine.h>
#include <rime/dict/vocabulary.h>
#include <rime/gear/charset_filter.h>
+#include <boost/locale/encoding.hpp>
namespace rime {
@@ -32,6 +33,15 @@ bool contains_extended_cjk(const string& text)
{
const char *p = text.c_str();
uint32_t ch;
+ string charset = "GB2312";
+
+ try {
+ boost::locale::conv::from_utf(text, charset, boost::locale::conv::method_type::stop);
+ return false;
+ } catch (...){
+ LOG(INFO)<<text<<"not in "<<charset;
+ return true;
+ }
while ((ch = utf8::unchecked::next(p)) != 0) {
if (is_extended_cjk(ch)) {
如果要做的話,yaml的語法怎麼定義呢?
仿照extended_charset
,再弄些gb2312_charset
、big5_charset
?
那如果要自定義字符集怎麼弄呢?比如需要指定 https://github.com/rime-aca/character_set 中的一個文件。
自定義字符集大概要做一個詞典文件,然後以文件名爲該項配置的值。
charset_filter:
charset: gbk # or custom_charset
@osfans 有沒有覺得現有架構有所欠缺?
我覺得已經很強大了。
switches:
- options: [ utf8, big5, gbk ]
states:
- UTF-8
- BIG5
- GBK
reset: 0
engine:
filters:
- charset_filter@big5
- charset_filter@gbk
big5:
option_name: big5
charset: big5
gbk:
option_name: gbk
charset: gbk
那如果要多個字符集之間切換呢? 光用charset可以區分嗎?還得使用option_name吧?
也可以通过 Ticket::name_space
拿到 @
之后那部份直接作为 option_name
,甚至也用作 charset
的值(如果可识别为已知字符集)。
突然發現,extended_charset是false起作用,好像不太適合做成switches/options。 其他charset都是true起作用。
支持標準字符集,name_space
直接用作option_name
和charset
。
switches:
- options: [ utf8, big5, gbk ]
states:
- UTF-8
- BIG5
- GBK
engine:
filters:
- charset_filter@big5
- charset_filter@gbk
不過translator/enable_charset_filter
還不能指定charset,不知道怎麼搞。
測試程序: https://github.com/osfans/trime/releases/download/v3.0-beta/trime-20151105-charset.apk
@osfans 嗯。这是当前架构的限制之一。造句应该改为由一个独立翻译器实现,他用的词典也应当可以单独配置。而且,现在只能在所有 translator 合并结果之后加 filter,而不能加到个别 translation 再做合并。这样组合能力就很弱。再比如,也不容易实现反查先简繁转换再反查。加选项来控制实在是一个错误的思路,这些原本应该通过排列组合小组件达成。 所以,我想设计个新架构,支持不支持?
支持!學習!
應該再加入測試代碼吧?
我想自定义2个字符集,一个是gb2312,一个是全集(utf8), 按照以上的方法:
switches:
engine: filters:
gb2312: option_name: gb2312 charset: gb2312
那如果要多個字符集之間切換呢?
没有产生效果。
求@osfans 实例代码。
@zaqzrh 直接這樣就好:
switches:
- options: [ utf8, gb2312]
states:
- UTF-8
- GB2312
engine:
filters:
- charset_filter@gb2312
translator:
enable_charset_filter: false
translator: enable_charset_filter: false @osfans拼音输入,没有成功。
上面这个"table/enable_charset_filter"中的table是什么意思?
我寫錯了,那就是translator。可能是你的librime太舊了?或者windows版還要其他庫?我用你的就可以,rong2 UTF可以打出镕,gb2312不能。
就是說有兩種charset_filter,
translator/enable_charset_filter
,option是extended_charset
。engine/filters/charset_filter@gb2312
,option是gb2312
。你如果不用第一種,那直接用第二種應該就可以。如果還留着第一個,那兩種會同時起作用。
如 rime/home#91 討論,暫時關閉。
想使用 charset_filter@gbk + Emoji,该如何配置呢?
確實有這個問題
@osfans 我自力更生吧,提交了一个 PR。
想使用 charset_filter@gbk + Emoji,该如何配置呢?
两年后,我终于回来填坑了。
https://github.com/rime/librime/pull/293 已经合并到 master,可以在配置文件使用 charset_filter@gbk+emoji
方式来添加 Emoji 支持了。
@zaqzrh 直接這樣就好:
switches: - options: [ utf8, gb2312] states: - UTF-8 - GB2312 engine: filters: - charset_filter@gb2312 translator: enable_charset_filter: false
@osfans 如上配置,会报
E0920 10:08:02.380353 1627 engine.cc:366] error creating filter: 'charset_filter'
请问是什么缘故,librime版本是最新的1.5.3
楼上的错误与我这里说的无关,但我想提醒后来人想要折腾 charset_filter
时要注意,因为在 19 年 12 月 27 号的一次提交中,librime 已经除去(根据 commit 信息说是降级好一点)了对 charset_filter
的支持。
如果你的输入法后端在编译时没有纳入 librime-charcode 组件,那 charset_filter
就可能失效。
参见:Issue#335
目前只有通過
extended_charset
過濾擴展字符集吧? https://github.com/rime/librime/blob/develop/src/gear/charset_filter.cc#L18Boost.Locale 庫是否可以過濾gbk、big5等標準字符集? 甚至自定義字符集https://github.com/rime-aca/character_set