Index: notification.py
===================================================================
--- notification.py	(revision 7093)
+++ notification.py	(working copy)
@@ -24,6 +24,14 @@
 from trac.util.text import CRLF, wrap
 from trac.notification import NotifyEmail
 
+def eastAsiaNum(uStr):
+    import unicodedata
+    uStr = unicode(uStr)
+    num = 0
+    for c in uStr:
+        if unicodedata.east_asian_width(c) != 'Na':
+            num += 1
+    return num
 
 class TicketNotificationSystem(Component):
 
@@ -145,8 +153,8 @@
             if len(fval) > width[idx + 1]:
                 width[idx + 1] = len(fval)
             i += 1
-        format = ('%%%is:  %%-%is  |  ' % (width[0], width[1]),
-                  ' %%%is:  %%-%is%s' % (width[2], width[3], CRLF))
+#        format = ('%%%is:  %%-%is  |  ' % (width[0], width[1]),
+#                  ' %%%is:  %%-%is%s' % (width[2], width[3], CRLF))
         l = (width[0] + width[1] + 5)
         sep = l * '-' + '+' + (self.COLS - l) * '-'
         txt = sep + CRLF
@@ -160,6 +168,9 @@
             if f['type'] == 'textarea' or '\n' in unicode(fval):
                 big.append((fname.capitalize(), CRLF.join(fval.splitlines())))
             else:
+                format = ('%%%is:  %%-%is  |  ' % (width[0] - eastAsiaNum(fname), width[1] - eastAsiaNum(fval)),
+                          ' %%%is:  %%-%is%s' % (width[2] - eastAsiaNum(fname), width[3] - eastAsiaNum(fval), CRLF))
+
                 txt += format[i % 2] % (fname.capitalize(), fval)
                 i += 1
         if i % 2:
