Growl for windowsで日本語が通らない理由を調べた
Growl for windowsで日本語が表示できなくってイロイロ調べてた。
一応、以下のように日本語が通ったという情報があったけど、たぶんMacをクライアントとしてネットワーク越しにWindowsのGrowlサーバ(と言っていいのかな?)にメッセージを投げてたらうまくいったということだと解釈した。
自分の場合は、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 さんから返答があった。この修正(+α)をリポジトリにコミットしてくれたとのこと!!