Growl for windowsで日本語が通らない理由を調べた

Growl for windowsで日本語が表示できなくってイロイロ調べてた。

一応、以下のように日本語が通ったという情報があったけど、たぶんMacをクライアントとしてネットワーク越しにWindowsGrowlサーバ(と言っていいのかな?)にメッセージを投げてたらうまくいったということだと解釈した。

自分の場合は、Windows単体でクライアント兼サーバとして試してみた。
以下のようなコードをC#で書いたが、1番目のメッセージ(英字のみ)はちゃんと通知があがってくるが、2番目のメッセージ(日本語)の通知があがってこないという現象におちいってた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Growl.Framework;

namespace GrowlCmd
{
    class Program
    {
        private static NotificationType notifyNormal = new NotificationType("notify", true);

        static void Main(string[] args)
        {

            Growler g = new Growler("GrowlCmd");
            NotificationType[] types = new NotificationType[] { notifyNormal };
            g.Register(ref types);

            g.Notify(types[0], "Test", "Hello", Priority.Normal, false);
            g.Notify(types[0], "Test", "こんにちは", Priority.Normal, false);
        }
    }
}

ブレークポイントを掛けながら調べてみると、Growl.Framework.NotificationPacketの中に埋め込まれているメッセージ長が間違っているため、結果的にデータが破棄されてしまっていることがわかった。

で、直してみた。

Index: NotificationPacket.cs
===================================================================
--- NotificationPacket.cs	(revision 20)
+++ NotificationPacket.cs	(working copy)
@@ -144,9 +144,9 @@
             bb.Append((byte)this.packetType);
             bb.Append(flags);
             bb.Append(this.notificationType.Name.Length);
-            bb.Append(this.title.Length);
-            bb.Append(this.description.Length);
-            bb.Append(this.applicationName.Length);
+            bb.Append(Encoding.UTF8.GetBytes(this.title).Length);
+            bb.Append(Encoding.UTF8.GetBytes(this.description).Length);
+            bb.Append(Encoding.UTF8.GetBytes(this.applicationName).Length);
             bb.Append(this.notificationType.Name);
             bb.Append(this.title);
             bb.Append(this.description);

無事日本語が通りました。

一応、ProjectのIssue trackerにも、このパッチとともに報告を上げておいた。

追記:2008.12.7

先日 briandunnington さんから返答があった。この修正(+α)をリポジトリにコミットしてくれたとのこと!!