MC's journal

Boomtime, the 69 day of Discord in the YOLD 3176

Övergång till UTF-8

Jag har äntligen tagit steget till UTF-8. Antagligen är jag sist i Sverige med det. Jag körde visserligen UTF-8 på Plan 9 redan 1995, för Plan 9 kunde ju inte något annat, men jag har varit kvar i en Latin 1-locale på unixar ända tills nu.

Orsaken är nog mest feghet, tror jag. Jag har känt mig otrygg med vad som skall hända med alla filer (och en del filnamn!) jag har i ISO 8859-1. Kommer de program jag använder att ens tolerera dem om jag byter till en locale som säger att jag använder UTF-8?

Använder jag UTF-8 kan jag dessutom inte längre att kunna arbeta obehindrat i konsolläge i FreeBSD, eftersom konsollen ännu inte kan UTF-8. Det är i och för sig ett mindre problem jämfört med de många andra jag föreställde mig att jag skulle få.

Nu gjorde jag i alla fall härom dagen

export LANG=en_US.UTF-8

och det verkar fungera för det mesta.

Jag fick göra en del konverteringar, men mycket av det dagliga arbetet hjälper Emacs mig med. Emacs kan automagiskt känna igen en fil i Latin 1 och nästan vilken annan kodning som helst om jag får tro manualen. Det fungerar faktiskt förvånansvärt bra för det mesta. Emacs fortsätter att spara filen i den kodningen så länge jag inte stoppar in tecken som inte kan representeras. Sedan jag sist försiktigt experimenterade med det här har Emacs blivit mycket bättre på Unicode-hantering.

Jag var däremot inte alls lika nöjd med hur xterm klarade sig. Jag vill förstås att min terminalemulator när den dyker på en kodpunkt som inte finns definierad i defaultfonten skall försöka hitta en annan font som kan visa dem, men det fungerade inte. Trevligt nog hade jag på en hackjunta nyligen blivit visad rxvt-forken rxvt-unicode, så jag installerade den och experimenterade lite. Jag är mycket nöjd med resultatet. Jag borde inte ha blivit förvånad, men allt fungerar också i en screen över ssh.

Jag fick några trevliga X-resurser för urxvt från bland annat Anders Waldenborg och kombinerat med mina gamla xterm-resurser blev det här resultatet:

urxvt.background:       #000000
urxvt.foreground:       gray90
urxvt.color0: black
urxvt.color1: IndianRed
urxvt.color2: palegreen
urxvt.color3: goldenrod
urxvt.color4: SteelBlue3
urxvt.color5: PaleVioletRed
urxvt.color6: cyan3
urxvt.color7: gray90
urxvt.color8: gray30
urxvt.color9: red
urxvt.color10: cyan4
urxvt.color11: DarkOrange
urxvt.color12: RoyalBlue3
urxvt.color13: HotPink
urxvt.color14: VioletRed
urxvt.color15: white

urxvt.colorBD:          #ffffff
! Amber:
urxvt.cursorColor:      #ff7f24
urxvt.highlightColor:   dimgrey
urxvt.scrollBar: false
urxvt.saveLines: 512
urxvt.secondaryScroll:  true
urxvt.termName: xterm-88color
urxvt.font: FIXFONT
urxvt.visualBell: true

där FIXFONT är definierad som

#define FIXFONT -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso10646-1

Resten fungerar väl med defaultinställningarna, tycker jag.

När jag väl bytt började jag förstås leka med andra saker också, till exempel trådmarkeringen i Gnus som jag nu plötsligt kan ha roligare tecken i, oavsett om jag kör min Emacs som X-tillämpning eller i en urxvt. Från min .gnus.el:

;;; Make threading look pretty with Unicode line-drawing.
(setq-default
 gnus-sum-thread-tree-single-indent " "
 gnus-sum-thread-tree-false-root ""
 gnus-sum-thread-tree-root "┌ "
 gnus-sum-thread-tree-vertical "│" 
 gnus-sum-thread-tree-leaf-with-other "├─>" 
 gnus-sum-thread-tree-single-leaf "└─>" 
 gnus-sum-thread-tree-indent "")

Det ser ut så här:

gnus-sum-unicode.png
Figure 1: Skärmdump från Gnus Summary i trådad vy för nanog-brevlistan.

Dessutom stoppade jag in utf-8 och utf-16 i den här listan:

(setq mm-body-charset-encoding-alist 
  '((utf-16 . 8bit)
    (utf-16be . 8bit)
    (utf-16le . 8bit)
    (utf-8 . 8bit)
    (iso-8859-1 . 8bit)))

för att vara någorlunda säker på att vanliga brev skrivna med Unicode inte skickas i BASE64 eller något annat hemskt som inte är så lätt att greppa i.

Å andra sidan finns specialfallet PGP-signerade brev. Som bekant kan det hända att vägen MUA-MTA-MTA-MUA inte alltid är helt åttabitarsren och det kan, men måste inte, förekomma konverteringar på vägen. Om mitt fina åttabitarsbrev blivit konverterat till Quoted (un)Printables på vägen så validerar förstås inte längre min PGP-signatur hos mottagaren. Misär!

Alltså behövs en liten revidering, speciellt vad gäller just signerade brev i klartext:

(setq mm-content-transfer-encoding-defaults 
  '(("text/.*" 8bit) 
    ("message/rfc822" 8bit) 
    ("application/emacs-lisp" 8bit) 
    ("application/x-emacs-lisp" 8bit) 
    ("application/x-patch" 8bit) 
    ("multipart/signed" qp) ; Obs!
    (".*" base64)))

Kanske är det fegt att säga att allt annat skall kodas som BASE64. Jag vet inte. Jag måste nog utföra lite experiment för att bli trygg med något annat där.

I Emacs i övrigt hakade jag också in det här för att kunna knappa in några vanliga tecken som annars inte finns på mitt tangentbord (ur min .emacs.el):

; em-dash
(define-key global-map [(meta \-)] "—")
; en-dash
(define-key global-map [(meta \_)] "–")
; quotes
(define-key global-map [(meta \!)] "“")
(define-key global-map [(meta \")] "”")

Det var värre med mina websidor. De serveras av webservern thttpd som av någon anledning alltid skickar med ”charset=foo” för MIME-typerna ”text/*” där ”foo” är vad du sagt i konfigurationen eller som default iso-8859-1. Det är alltså inte beroende på vad filerna faktiskt råkar vara kodade i!

Jag är mycket nöjd med thttpd i övrigt, men just det här var bara korkat. Tyvärr går just detta inte att konfigurera bort, så det slutade med en omkompilering efter följande ändring i thttpd 2.25b:

--- mime_types.txt~ 2003-10-26 18:00:45.000000000 +0100
+++ mime_types.txt  2010-05-18 23:11:14.000000000 +0200
@@ -14,6 +14,7 @@
 asc    text/plain
 asf    video/x-ms-asf
 asx    video/x-ms-asf
+atom   application/atom+xml
 au audio/basic
 avi    video/x-msvideo
 bcpio  application/x-bcpio
@@ -52,8 +53,8 @@
 gtar   application/x-gtar
 hdf    application/x-hdf
 hqx    application/mac-binhex40
-htm    text/html; charset=%s
-html   text/html; charset=%s
+htm    text/html
+html   text/html
 ice    x-conference/x-cooltalk
 ief    image/ief
 iges   model/iges
@@ -161,7 +162,7 @@
 tr application/x-troff
 tsp    application/dsptype
 tsv    text/tab-separated-values
-txt    text/plain; charset=%s
+txt    text/plain
 ustar  application/x-ustar
 vcd    application/x-cdlink
 vrml   model/vrml

Jag tog alltså helt enkelt bort att ”charset” skickas med överhuvudtaget i innehållsdeklarationen. Dessutom passade jag på att lägga till en MIME-typ för Atom-flöden, som ni ser. (Förresten validerar nu Atom-flödet enligt W3C Feed Validator, men det är nog ett annat bloginlägg.)

Efter den här förändringen litar jag dessvärre på att filerna som serveras som MIME-typerna ”text/*” själva skall tala om vad de har för teckenuppsättning. Det gör inte alla än, men i de browsers jag testat (w3m, Lynx, Firefox och Internet Explorer 7), så verkar den inbyggda heuristiken för att känna igen teckenuppsättningar ändå fungera ganska bra.

Jag ändrade också på mitt lilla script för att generera websidor, mdn, så att den deklarerar teckenuppsättning som UTF-8 i stället för ISO-8859-1. Samma ändring gjorde jag i Blosxom som genererar den här bloggen.

Jag skrev ett throw away-script för att konvertera alla inlägg i bloggen till UTF-8. Tyvärr var det lite buggigt, så det blev lite handpåläggning på några inlägg i alla fall. Hade jag inte gjort någon konverting hade det nästa gång jag skriver ett inlägg (nu, alltså!) blivit en intressant blandning av Latin 1 och UTF-8, med bara en innehållsdeklaration, åtminstone i HTML-filen.

En del andra filer konverterade jag med hjälp av iconv och passade i en del fall på att dessutom börja använda min nya Markdown-baserade märkning. Jag byter alltså långsamt från min gamla hackade txt2tags till mitt eget mdn.

Slutsatsen är ändå att bytet till UTF-8 gått ganska bra, i alla fall än så länge. Jag får nog tacka Emacs och urxvt mest för det, tror jag.

Jag slutar med lite roande läsning i form av några brev från Rob Pike om tillblivelsen av UTF-8 som Marcus Kuhn sparat:

http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt

サヨウナラ,
MC

(Sayōnara, alltså. Jag kan inte ens lite japanska, men det är ju ett kul test av UTF-8.)


Written by MC using Emacs and friends.