rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.37k stars 551 forks source link

自定義字符集 #59

Closed osfans closed 8 years ago

osfans commented 8 years ago

目前只有通過extended_charset過濾擴展字符集吧? https://github.com/rime/librime/blob/develop/src/gear/charset_filter.cc#L18

Boost.Locale 庫是否可以過濾gbk、big5等標準字符集? 甚至自定義字符集https://github.com/rime-aca/character_set

osfans commented 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_charsetbig5_charset? 那如果要自定義字符集怎麼弄呢?比如需要指定 https://github.com/rime-aca/character_set 中的一個文件。

lotem commented 8 years ago

自定義字符集大概要做一個詞典文件,然後以文件名爲該項配置的值。

charset_filter:
  charset: gbk  # or custom_charset

@osfans 有沒有覺得現有架構有所欠缺?

osfans commented 8 years ago

我覺得已經很強大了。

osfans commented 8 years ago
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吧?

lotem commented 8 years ago

也可以通过 Ticket::name_space 拿到 @ 之后那部份直接作为 option_name,甚至也用作 charset 的值(如果可识别为已知字符集)。

osfans commented 8 years ago

突然發現,extended_charset是false起作用,好像不太適合做成switches/options。 其他charset都是true起作用。

osfans commented 8 years ago

支持標準字符集,name_space直接用作option_namecharset

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

lotem commented 8 years ago

@osfans 嗯。这是当前架构的限制之一。造句应该改为由一个独立翻译器实现,他用的词典也应当可以单独配置。而且,现在只能在所有 translator 合并结果之后加 filter,而不能加到个别 translation 再做合并。这样组合能力就很弱。再比如,也不容易实现反查先简繁转换再反查。加选项来控制实在是一个错误的思路,这些原本应该通过排列组合小组件达成。 所以,我想设计个新架构,支持不支持?

osfans commented 8 years ago

支持!學習!

ghost commented 8 years ago

應該再加入測試代碼吧?

zaqzrh commented 8 years ago

我想自定义2个字符集,一个是gb2312,一个是全集(utf8), 按照以上的方法:

switches:

engine: filters:

gb2312: option_name: gb2312 charset: gb2312

那如果要多個字符集之間切換呢?

没有产生效果。

求@osfans 实例代码。

osfans commented 8 years ago

@zaqzrh 直接這樣就好:

switches:
  - options: [ utf8, gb2312]
    states:
      - UTF-8
      - GB2312
engine:
  filters:
    - charset_filter@gb2312
translator:
  enable_charset_filter: false
zaqzrh commented 8 years ago

translator: enable_charset_filter: false @osfans拼音输入,没有成功。

上面这个"table/enable_charset_filter"中的table是什么意思?

osfans commented 8 years ago

我寫錯了,那就是translator。可能是你的librime太舊了?或者windows版還要其他庫?我用你的就可以,rong2 UTF可以打出镕,gb2312不能。

osfans commented 8 years ago

就是說有兩種charset_filter,

  1. 原來的是常用和擴展,開關是translator/enable_charset_filter,option是extended_charset
  2. 新的這個是指定字符集,開關是engine/filters/charset_filter@gb2312,option是gb2312

你如果不用第一種,那直接用第二種應該就可以。如果還留着第一個,那兩種會同時起作用。

osfans commented 8 years ago

如 rime/home#91 討論,暫時關閉。

alswl commented 7 years ago

想使用 charset_filter@gbk + Emoji,该如何配置呢?

osfans commented 7 years ago

確實有這個問題

alswl commented 6 years ago

@osfans 我自力更生吧,提交了一个 PR。

alswl commented 5 years ago

想使用 charset_filter@gbk + Emoji,该如何配置呢?

两年后,我终于回来填坑了。

https://github.com/rime/librime/pull/293 已经合并到 master,可以在配置文件使用 charset_filter@gbk+emoji 方式来添加 Emoji 支持了。

f4nyc commented 5 years ago

@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

IceCodeNew commented 4 years ago

楼上的错误与我这里说的无关,但我想提醒后来人想要折腾 charset_filter 时要注意,因为在 19 年 12 月 27 号的一次提交中,librime 已经除去(根据 commit 信息说是降级好一点)了对 charset_filter 的支持。 如果你的输入法后端在编译时没有纳入 librime-charcode 组件,那 charset_filter 就可能失效。

参见:Issue#335