QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4303|回复: 35

KDE Knode 中文新闻组名补丁

[复制链接]
发表于 2004-6-5 21:02:29 | 显示全部楼层 |阅读模式
Kanker,我昨天对kdepim进行的修正,knode现在可以看中文的组名了,你测试一下,如果可以请加入到kdepim中。

[code:1]diff -ruN kdepim-3.2.2/knode/knarticlewidget.cpp kdepim-3.2.2.cjk/knode/knarticlewidget.cpp
--- kdepim-3.2.2/knode/knarticlewidget.cpp        2004-04-04 06:14:03.000000000 -0300
+++ kdepim-3.2.2.cjk/knode/knarticlewidget.cpp        2004-06-04 19:33:25.754204504 -0300
@@ -191,7 +191,7 @@
   QStringList cs=KGlobal::charsets()->availableEncodingNames();
   cs.prepend(i18n("Automatic"));
   a_ctSetCharset->setItems(cs);
-  a_ctSetCharset->setCurrentItem(0);
+  a_ctSetCharset->setCurrentItem(34);
   connect(a_ctSetCharset, SIGNAL(activated(const QString&)),
           this, SLOT(slotSetCharset(const QString&)));
   a_ctSetCharsetKeyb = new KAction(i18n("Charset"), Key_C, this,
diff -ruN kdepim-3.2.2/knode/knconfig.cpp kdepim-3.2.2.cjk/knode/knconfig.cpp
--- kdepim-3.2.2/knode/knconfig.cpp        2003-10-26 06:57:45.000000000 -0400
+++ kdepim-3.2.2.cjk/knode/knconfig.cpp        2004-06-04 19:43:24.030252720 -0300
@@ -979,7 +979,7 @@
     c_omposerCharsets=QStringList::split(',',"us-ascii,utf-8,iso-8859-1,iso-8859-2,"
     "iso-8859-3,iso-8859-4,iso-8859-5,iso-8859-6,iso-8859-7,iso-8859-8,"
     "iso-8859-9,iso-8859-10,iso-8859-13,iso-8859-14,iso-8859-15,koi8-r,koi8-u,"
-    "iso-2022-jp,iso-2022-jp-2,iso-2022-kr,euc-jp,euc-kr,Big5,gb2312");
+    "iso-2022-jp,iso-2022-jp-2,iso-2022-kr,euc-jp,euc-kr,Big5,gb2312,gbk,gb18030");

   c_harset=conf->readEntry("Charset").latin1();
   if (c_harset.isEmpty()) {
diff -ruN kdepim-3.2.2/knode/kngroup.cpp kdepim-3.2.2.cjk/knode/kngroup.cpp
--- kdepim-3.2.2/knode/kngroup.cpp        2003-08-08 06:09:07.000000000 -0300
+++ kdepim-3.2.2.cjk/knode/kngroup.cpp        2004-06-04 20:44:14.870240680 -0300
@@ -38,7 +38,7 @@
KNGroup::KNGroup(KNCollection *p)
   : KNArticleCollection(p), n_ewCount(0), l_astFetchCount(0), r_eadCount(0),
     l_astNr(0), m_axFetch(0), d_ynDataFormat(1), f_irstNew(-1), l_ocked(false),
-    u_seCharset(false), s_tatus(unknown), i_dentity(0)
+    u_seCharset(true), s_tatus(unknown), i_dentity(0)
{
}

@@ -85,7 +85,7 @@
   f_irstNr = info.readNumEntry("firstMsg",0);
   l_astNr = info.readNumEntry("lastMsg",0);
   d_ynDataFormat = info.readNumEntry("dynDataFormat",0);
-  u_seCharset = info.readBoolEntry("useCharset", false);
+  u_seCharset = info.readBoolEntry("useCharset", true);
   d_efaultChSet = info.readEntry("defaultChSet").latin1();
   QString s = info.readEntry("status","unknown");
   if (s=="readOnly")
diff -ruN kdepim-3.2.2/knode/kngroupmanager.cpp kdepim-3.2.2.cjk/knode/kngroupmanager.cpp
--- kdepim-3.2.2/knode/kngroupmanager.cpp        2003-08-08 06:09:07.000000000 -0300
+++ kdepim-3.2.2.cjk/knode/kngroupmanager.cpp        2004-06-04 20:47:44.375391056 -0300
@@ -115,18 +115,18 @@
       sepPos1 = line.find(' ');

       if (sepPos1==-1) {        // no description
-        name = QString::fromUtf8(line);
+        name = QString::fromLocal8Bit(line);
         description = QString::null;
         status = KNGroup::unknown;
       } else {
-        name = QString::fromUtf8(line.left(sepPos1));
+        name = QString::fromLocal8Bit(line.left(sepPos1));

         sepPos2 = line.find(' ',sepPos1+1);
         if (sepPos2==-1) {        // no status
-          description = QString::fromUtf8(line.right(line.length()-sepPos1-1));
+          description = QString::fromLocal8Bit(line.right(line.length()-sepPos1-1));
           status = KNGroup::unknown;
         } else {
-          description = QString::fromUtf8(line.right(line.length()-sepPos2-1));
+          description = QString::fromLocal8Bit(line.right(line.length()-sepPos2-1));
           switch (line[sepPos1+1]) {
             case 'u':   status = KNGroup::unknown;
                         break;
@@ -171,7 +171,7 @@

   if(f.open(IO_WriteOnly)) {
     for (KNGroupInfo *i=groups->first(); i; i=groups->next()) {
-      temp = i->name.utf8();
+      temp = i->name.local8Bit();
       switch (i->status) {
         case KNGroup::unknown: temp += " u ";
                                break;
@@ -182,7 +182,7 @@
         case KNGroup::moderated: temp += " m ";
                                  break;
       }
-      temp += i->description.utf8() + "\n";
+      temp += i->description.local8Bit() + "\n";
       f.writeBlock(temp.data(),temp.length());
     }
     f.close();
diff -ruN kdepim-3.2.2/knode/knnntpclient.cpp kdepim-3.2.2.cjk/knode/knnntpclient.cpp
--- kdepim-3.2.2/knode/knnntpclient.cpp        2004-01-17 08:55:17.000000000 -0400
+++ kdepim-3.2.2.cjk/knode/knnntpclient.cpp        2004-06-04 22:20:45.024553432 -0300
@@ -113,7 +113,7 @@
     } else {
       s[0] = 0;    // cut string

-      name = QString::fromUtf8(line);
+      name = QString::fromLocal8Bit(line);

       if (target->subscribed.contains(name)) {
         target->subscribed.remove(name);    // group names are unique, we wont find it again anyway...
@@ -182,7 +182,7 @@
           s++;
           while (*s == ' ' || *s == '\t') s++;    // go on to the description

-          name = QString::fromUtf8(line);
+          name = QString::fromLocal8Bit(line);
           if (target->codecForDescriptions)          // some countries use local 8 bit characters in the tag line
             description = target->codecForDescriptions->toUnicode(s);
           else
@@ -248,7 +248,7 @@
#endif
     } else {
       s[0] = 0;    // cut string
-      name = QString::fromUtf8(line);
+      name = QString::fromLocal8Bit(line);

       while (s[1]!=0) s++;   // the last character determines the moderation status
       switch (s[0]) {
@@ -284,7 +284,7 @@
     int rep;

     for (KNGroupInfo *group=tmpList.first(); group; group=tmpList.next()) {
-      if (!sendCommand(cmd+group->name.utf8(),rep))
+      if (!sendCommand(cmd+group->name.local8Bit(),rep))
         return;
       if (rep != 215)        // 215 informations follows
         break;
@@ -339,7 +339,7 @@
               .arg(account.server()).arg(target->groupname());

   cmd="GROUP ";
-  cmd+=target->groupname().utf8();
+  cmd+=target->groupname().local8Bit();
   if (!sendCommandWCheck(cmd,211)) {       // 211 n f l s group selected
     return;
   }
@@ -440,7 +440,7 @@
     QString groupName = static_cast<KNGroup*>(target->collection())->groupname();
     if (currentGroup != groupName) {
       cmd="GROUP ";
-      cmd+=groupName.utf8();
+      cmd+=groupName.local8Bit();
       if (!sendCommandWCheck(cmd,211))       // 211 n f l s group selected
         return;
       currentGroup = groupName;
diff -ruN kdepim-3.2.2/libkdenetwork/kmime_headers.cpp kdepim-3.2.2.cjk/libkdenetwork/kmime_headers.cpp
--- kdepim-3.2.2/libkdenetwork/kmime_headers.cpp        2003-07-28 04:09:53.000000000 -0300
+++ kdepim-3.2.2.cjk/libkdenetwork/kmime_headers.cpp        2004-06-04 22:22:54.000946040 -0300
@@ -946,14 +946,14 @@

void Newsgroups::fromUnicodeString(const QString &s, const QCString&)
{
-  g_roups=s.utf8();
+  g_roups=s.local8Bit();
   e_ncCS=cachedCharset("UTF-8");
}


QString Newsgroups::asUnicodeString()
{
-  return QString::fromUtf8(g_roups);
+  return QString::fromLocal8Bit(g_roups);
}
[/code:1]
 楼主| 发表于 2004-6-5 21:31:55 | 显示全部楼层
哦,忘了说了。我的补丁是GPL的。其实我是在cjacker的补丁的基础上改出来的我的补丁已经提交到gentoo上去了,就让那些日本人和韩国人去测试吧。希望以后大家的补丁能基本向cjk兼容,顺便帮一下小日本和韩国,^_^。虽然我比较恨日本人(南京大屠杀),^_^
回复

使用道具 举报

发表于 2004-6-5 22:25:22 | 显示全部楼层
我觉得,GPL是没有国界的,大家都要向国际化靠拢。
我们甚至可以是激进的民族主义者,但是,当我们GPL了,那么,在GPL之下的一切都不应该有国界。 大道理讲得不好,大家表骂我。
呵呵,所以,我很欣赏jackey,
回复

使用道具 举报

发表于 2004-6-5 22:28:44 | 显示全部楼层
OK,不日将更新。
回复

使用道具 举报

发表于 2004-6-5 22:49:28 | 显示全部楼层
我觉得 patch 要足够 clean,需要满足的条件是在任何 locale 设置下能够正常解码任何字符串(包括CJK)。上面的 patch 可能在 GB2312/GB18030 下读 UTF-8 或者 Jap/Kor 编码的字符串有问题,在 UTF-8 locale 下读 GB2312/GB18030 可能也有问题。不能解决一个问题,产生新的问题。我的猜测只是从 patch 本身而言,我没有读 knode 的其它源代码。
回复

使用道具 举报

 楼主| 发表于 2004-6-5 23:07:56 | 显示全部楼层
[quote:97b2a0c116="kral"]我觉得 patch 要足够 clean,需要满足的条件是在任何 locale 设置下能够正常解码任何字符串(包括CJK)。上面的 patch 可能在 GB2312/GB18030 下读 UTF-8 或者 Jap/Kor 编码的字符串有问题,在 UTF-8 locale 下读 GB2312/GB18030 可能也有问题。不能解决一个问题,产生新的问题。我的猜测只是从 patch 本身而言,我没有读 knode 的其它源代码。[/quote]
你能具体一点吗?
cjacker也不知道死哪儿去了,我还想请教一点东西呢。cjacker看到我的帖子冒个泡哟!
回复

使用道具 举报

发表于 2004-6-6 11:10:07 | 显示全部楼层
晕,刚发现其实ml的kdepim已打上knote的中文补丁了,因我没订新闻组名为中文的,没法测试,请用 kde3.2.2 for ml1.2的朋友们测试一下看有没有问题。
不过原来的补丁有个问题是只适用于中文gb3212
回复

使用道具 举报

发表于 2004-6-6 12:13:27 | 显示全部楼层
不是号称cjacker去红旗了吗?不过好久没见他来公社冒泡了哦。
关于中文的新闻组,可以去新帆, nntp://news.newsfan.net
回复

使用道具 举报

发表于 2004-6-6 13:07:18 | 显示全部楼层
呵呵,经测试没有问题,jackey的补丁就等等吧
回复

使用道具 举报

发表于 2004-6-6 14:58:35 | 显示全部楼层
[quote:84ad2eafac="KanKer"]呵呵,经测试没有问题,jackey的补丁就等等吧 [/quote]

测试了把语言设置成英文时看中文 group 名字的情况没有?

QString::fromLocal8bit 的功能是把传入的字符串以本地语言设置的编码方法解码到 Unicode。我还没有看其具体实现的代码。如果它没有使用 heuristic* 类函数来试图找出实际编码,那么在英文环境下就不能显示 gb2312/gb18030 的中文,而这是我们 CJK patch 应该实现的目标。

KanKer 测试一下
回复

使用道具 举报

发表于 2004-6-6 22:20:22 | 显示全部楼层
[quote:f55fe85a8b="kral"][quote:f55fe85a8b="KanKer"]呵呵,经测试没有问题,jackey的补丁就等等吧 [/quote]

测试了把语言设置成英文时看中文 group 名字的情况没有?

QString::fromLocal8bit 的功能是把传入的字符串以本地语言设置的编码方法解码到 Unicode。我还没有看其具体实现的代码。如果它没有使用 heuristic* 类函数来试图找出实际编码,那么在英文环境下就不能显示 gb2312/gb18030 的中文,而这是我们 CJK patch 应该实现的目标。

KanKer 测试一下 [/quote]

我写了一个很小的测试程序来说明问题,请下载 http://home.lark.net.cn/linux/qtstringtest.tgz

执行
$ make; make test

如果找不到 qstring.h,请编辑一下 Makefile 的 -I 以及 -L
回复

使用道具 举报

发表于 2004-6-6 23:21:27 | 显示全部楼层
[quote:bbf47cdc72="樱家冢"]不是号称cjacker去红旗了吗?不过好久没见他来公社冒泡了哦。
关于中文的新闻组,可以去新帆, nntp://news.newsfan.net[/quote]

去红旗工作了?
回复

使用道具 举报

发表于 2004-6-7 00:39:36 | 显示全部楼层
这个补丁怎么用呀?
回复

使用道具 举报

发表于 2004-6-7 18:13:27 | 显示全部楼层
[quote:ff68db69e8="樱家冢"]不是号称cjacker去红旗了吗?不过好久没见他来公社冒泡了哦。
关于中文的新闻组,可以去新帆, nntp://news.newsfan.net[/quote]

那 ML 的开发…………
回复

使用道具 举报

发表于 2004-6-8 18:44:10 | 显示全部楼层
作这个补丁的时候就考虑到UTF8问题,恰恰就是因为国内几个像样的新闻组都用locale去做,不用UTF8才需要这个补丁,knode的作者也是因为这个原因才拒绝作任何改动,因为knode是没有问题的,全部按照UTF8去做,但是这是不适合中国的。

打了补丁之后,knode只能显示locale的帖子,如果是UTF8的可以通过手动改变编码去完成,但是UTF8的组名就没戏了,至少到目前,国内还没有UTF8的中文组名。

所以,以上补丁有其现实意义,并且就补丁本身而言,这么做也是对的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-20 18:33 , Processed in 0.129543 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表