On Tue, 20 Jan 2009, Volkan YAZICI <yazic...@ttmail.com> writes:
> In various places of the BBDB source code, it uses (downcase name) like
> tricks to compare the identifiers, e.g. aka names. But default downcase
> function of emacs uses current LC_CTYPE that emacs session is
> initialized with. As a result of this, when gnus receives messages
> encoded in different locales, bbdb doesn't switch to the case conversion
> table related mail locale is set to and `downcase' doesn't work as it
> should. Consider below case.
>
> - Emacs is initialized with en_US.UTF-8 locale,
> - And mail is encoded in tr_TR.UTF-8 where "From:" line is "İI".
>
> By default, (downcase name) will return "İi", which is obviously
> broken. (The correct conversion should be "iı".)
>
> I searched previous posts[1] regarding with the similar issues, which
> recommends (funcall 'string-make-unibyte name) like hacks, but this
> doesn't solve the problem too. (Locale is still not changed during
> conversion.)
>
>   (let ((name (string-make-unibyte "İI")))
>     (list name (downcase name)))
>   => ("\320I" "\320i")
>
> I'm not very good at BBDB internals. Could somebody help me to fix the
> problem?

I'm not very good at emacs lisp hacking, but here is my ad-hoc solution
to the problem.


;;; tr_TR.UTF-8 to ASCII Translation

(defvar tr-utf8-to-ascii-translation-alist
  '((?ç . ?c) (?Ç . ?C)
    (?ğ . ?g) (?Ğ . ?G)
    (?ı . ?i) (?İ . ?I)
    (?ö . ?o) (?Ö . ?O)
    (?ş . ?s) (?Ş . ?S)
    (?ü . ?u) (?Ü . ?U)))

(defun tr-utf8-to-ascii (start end)
  "Converts supplied text region of tr_TR.UTF-8 locale to ASCII format."
  (interactive "r")
  (translate-region
   start end (make-translation-table tr-utf8-to-ascii-translation-alist)))


;; Fix `bbdb-check-alternate-name' to handle Turkish characters in a smarter
;; way while downcasing.

(defun bbdb-normalize-name (name)
  "Normalizes (hairy downcasing) given string parameter."
  (coerce
   (mapcar
    (lambda (char)
      (downcase
       (or (cdr (assoc char tr-utf8-to-ascii-translation-alist))
           char)))
    (coerce name 'list))
   'string))

(defun bbdb-name= (a b)
  "Return t if two names are equal after normalizing them. (See
`bbdb-normalize-name' for further details.)"
  (string= (bbdb-normalize-name a) (bbdb-normalize-name b)))

(defun bbdb-check-alternate-name (possible-name record)
  "If there is any, finds a suitable `bbdb-record-aka' with
respect to supplied parameters."
  (dolist (aka (bbdb-record-aka record))
    (when (bbdb-name= possible-name aka)
      (return aka))))

And here is a small demonstration for the `bbdb-normalize-name'
function: (bbdb-normalize-name "ıIüÜşŞiİçÇöÖ") => "iiuussiiccoo".


Regards.

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
bbdb-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bbdb-info
BBDB Home Page: http://bbdb.sourceforge.net/

Reply via email to