Thai characters do not display properly in Linux console. If you mainly use X window, you may pass this section.
You can obtain Linux Thai console fonts which created by Mr. from ZzzThai ftp site
For example, there is a font name "phaisarn.psf". Put it in /usr/lib/kbd/consolefonts/
directory. Then, you can load the new font from Linux console by command
%setfont phaisarn.psf
You can set keyboard behavior as you like by using loadkeys
command. Usually, you use loadkeys
to load the file located in /usr/lib/kbd/keytables
. You can create a US/Thai keyboard-map file and save it in this directory. Here is a sample.
keycode 0 = keycode 1 = Escape Escape alt keycode 1 = Meta_Escape keycode 2 = +one exclam +0x0e5 plus alt keycode 2 = Meta_one alt shift keycode 2 = Meta_exclam keycode 3 = +two at +slash 0x0f1 control keycode 3 = nul control shift keycode 3 = nul alt keycode 3 = Meta_two alt shift keycode 3 = Meta_at keycode 4 = +three numbersign +underscore 0x0f2 control keycode 4 = Escape alt keycode 4 = Meta_three alt shift keycode 4 = Meta_numbersign keycode 5 = +four dollar +0x0c0 0x0f3 control keycode 5 = Control_backslash alt keycode 5 = Meta_four alt shift keycode 5 = Meta_dollar keycode 6 = +five percent +0x0b6 0x0f4 control keycode 6 = Control_bracketright alt keycode 6 = Meta_five alt shift keycode 6 = Meta_percent keycode 7 = +six asciicircum +0x0d8 0x0d9 control keycode 7 = Control_asciicircum alt keycode 7 = Meta_six alt shift keycode 7 = Meta_asciicircum keycode 8 = +seven ampersand +0x0d6 0x0df control keycode 8 = Control_underscore alt keycode 8 = Meta_seven keycode 9 = +eight asterisk +0x0a4 0x0f5 control keycode 9 = Delete alt keycode 9 = Meta_eight keycode 10 = +nine parenleft +0x0b5 0x0d6 alt keycode 10 = Meta_nine keycode 11 = +zero parenright +0x0a8 0x0f7 alt keycode 11 = Meta_zero keycode 12 = +minus underscore +0x0a2 0x0f8 control keycode 12 = Control_underscore control shift keycode 12 = Control_underscore alt keycode 12 = Meta_minus keycode 13 = +equal plus +0x0aa 0x0f9 alt keycode 13 = Meta_equal keycode 14 = Delete Delete Delete Delete alt keycode 14 = Meta_Delete keycode 15 = Tab Tab Tab Tab alt keycode 15 = Meta_Tab keycode 16 = +q Q +0x0e6 0x0f0 keycode 17 = +w W +0x0e4 quotedbl keycode 18 = +e E +0x0d3 0x0ae keycode 19 = +r R +0x0be 0x0b1 keycode 20 = +t T +0x0d0 0x0b8 keycode 21 = +y Y +0x0d1 0x0ed keycode 22 = +u U +0x0d5 0x0ea keycode 23 = +i I +0x0c3 0x0b3 keycode 24 = +o O +0x0b9 0x0cf keycode 25 = +p P +0x0c2 0x0ad keycode 26 = +bracketleft braceleft +0x0ba 0x0b0 control keycode 26 = Escape alt keycode 26 = Meta_bracketleft alt shift keycode 26 = Meta_braceleft keycode 27 = +bracketright braceright +0x0c5 comma control keycode 27 = Control_bracketright alt keycode 27 = Meta_bracketright alt shift keycode 27 = Meta_braceright keycode 28 = Return Return Return Return alt keycode 28 = 0x080d keycode 29 = Control Control Control Control keycode 30 = +a A +0x0bf 0x0c4 keycode 31 = +s S +0x0cb 0x0a6 keycode 32 = +d D +0x0a1 0x0af keycode 33 = +f F +0x0b4 0x0e2 keycode 34 = +g G +0x0e0 0x0ac keycode 35 = +h H +0x0e9 0x0e7 keycode 36 = +j J +0x0e8 0x0eb keycode 37 = +k K +0x0d2 0x0c9 keycode 38 = +l L +0x0ca 0x0c8 keycode 39 = +semicolon colon +0x0c7 0x0ab alt keycode 39 = Meta_semicolon keycode 40 = +apostrophe quotedbl +0x0a7 period control keycode 40 = Control_g alt keycode 40 = Meta_apostrophe keycode 41 = +grave asciitilde +minus percent control keycode 41 = nul alt keycode 41 = Meta_grave keycode 42 = Shift Shift Shift Shift keycode 43 = +backslash bar +0x0a3 0x0a5 control keycode 43 = Control_backslash alt keycode 43 = Meta_backslash alt shift keycode 43 = Meta_bar keycode 44 = +z Z +0x0bc parenleft keycode 45 = +x X +0x0bb parenright keycode 46 = +c C +0x0e1 0x0a9 keycode 47 = +v V +0x0cd 0x0ce keycode 48 = +b B +0x0d4 0x0da keycode 49 = +n N +0x0d7 0x0ec keycode 50 = +m M +0x0b7 question keycode 51 = +comma less +0x0c1 0x0b2 alt keycode 51 = Meta_comma alt shift keycode 51 = Meta_less keycode 52 = +period greater +0x0e3 0x0cc alt keycode 52 = Meta_period alt shift keycode 52 = Meta_greater keycode 53 = +slash question +0x0bd 0x0c6 control keycode 53 = Delete alt keycode 53 = Meta_slash keycode 54 = Shift Shift Shift Shift keycode 55 = KP_Multiply keycode 56 = Alt Alt Alt Alt keycode 57 = space space space space control keycode 57 = nul alt keycode 57 = Meta_space keycode 58 = Caps_Lock Caps_Lock Caps_Lock Caps_Lock keycode 59 = F1 F11 Console_13 control keycode 59 = F1 alt keycode 59 = Console_1 control alt keycode 59 = Console_1 keycode 60 = F2 F12 Console_14 control keycode 60 = F2 alt keycode 60 = Console_2 control alt keycode 60 = Console_2 keycode 61 = F3 F13 Console_15 control keycode 61 = F3 alt keycode 61 = Console_3 control alt keycode 61 = Console_3 keycode 62 = F4 F14 Console_16 control keycode 62 = F4 alt keycode 62 = Console_4 control alt keycode 62 = Console_4 keycode 63 = F5 F15 Console_17 control keycode 63 = F5 alt keycode 63 = Console_5 control alt keycode 63 = Console_5 keycode 64 = F6 F16 Console_18 control keycode 64 = F6 alt keycode 64 = Console_6 control alt keycode 64 = Console_6 keycode 65 = F7 F17 Console_19 control keycode 65 = F7 alt keycode 65 = Console_7 control alt keycode 65 = Console_7 keycode 66 = F8 F18 Console_20 control keycode 66 = F8 alt keycode 66 = Console_8 control alt keycode 66 = Console_8 keycode 67 = F9 F19 Console_21 control keycode 67 = F9 alt keycode 67 = Console_9 control alt keycode 67 = Console_9 keycode 68 = F10 F20 Console_22 control keycode 68 = F10 alt keycode 68 = Console_10 control alt keycode 68 = Console_10 keycode 69 = Num_Lock keycode 70 = Scroll_Lock Show_Memory Show_Registers control keycode 70 = Show_State alt keycode 70 = Scroll_Lock keycode 71 = KP_7 alt keycode 71 = Ascii_7 keycode 72 = KP_8 alt keycode 72 = Ascii_8 keycode 73 = KP_9 alt keycode 73 = Ascii_9 keycode 74 = KP_Subtract keycode 75 = KP_4 alt keycode 75 = Ascii_4 keycode 76 = KP_5 alt keycode 76 = Ascii_5 keycode 77 = KP_6 alt keycode 77 = Ascii_6 keycode 78 = KP_Add keycode 79 = KP_1 alt keycode 79 = Ascii_1 keycode 80 = KP_2 alt keycode 80 = Ascii_2 keycode 81 = KP_3 alt keycode 81 = Ascii_3 keycode 82 = KP_0 alt keycode 82 = Ascii_0 keycode 83 = KP_Period altgr control keycode 83 = Boot control alt keycode 83 = Boot keycode 84 = Last_Console keycode 85 = keycode 86 = less greater bar alt keycode 86 = Meta_less keycode 87 = F11 F11 Console_23 control keycode 87 = F11 alt keycode 87 = Console_11 control alt keycode 87 = Console_11 keycode 88 = F12 F12 Console_24 control keycode 88 = F12 alt keycode 88 = Console_12 control alt keycode 88 = Console_12 keycode 89 = keycode 90 = keycode 91 = keycode 92 = keycode 93 = keycode 94 = keycode 95 = keycode 96 = KP_Enter keycode 97 = Control keycode 98 = KP_Divide keycode 99 = Control_backslash control keycode 99 = Control_backslash alt keycode 99 = Control_backslash keycode 100 = AltGr_Lock keycode 101 = Break keycode 102 = Find keycode 103 = Up keycode 104 = Prior shift keycode 104 = Scroll_Backward keycode 105 = Left alt keycode 105 = Decr_Console keycode 106 = Right alt keycode 106 = Incr_Console keycode 107 = Select keycode 108 = Down keycode 109 = Next shift keycode 109 = Scroll_Forward keycode 110 = Insert keycode 111 = Remove altgr control keycode 111 = Boot control alt keycode 111 = Boot keycode 112 = keycode 113 = keycode 114 = keycode 115 = keycode 116 = keycode 117 = keycode 118 = keycode 119 = keycode 120 = keycode 121 = keycode 122 = keycode 123 = keycode 124 = keycode 125 = keycode 126 = keycode 127 = string F1 = "\033[[A" string F2 = "\033[[B" string F3 = "\033[[C" string F4 = "\033[[D" string F5 = "\033[[E" string F6 = "\033[17~" string F7 = "\033[18~" string F8 = "\033[19~" string F9 = "\033[20~" string F10 = "\033[21~" string F11 = "\033[23~" string F12 = "\033[24~" string F13 = "\033[25~" string F14 = "\033[26~" string F15 = "\033[28~" string F16 = "\033[29~" string F17 = "\033[31~" string F18 = "\033[32~" string F19 = "\033[33~" string F20 = "\033[34~" string Find = "\033[1~" string Insert = "\033[2~" string Remove = "\033[3~" string Select = "\033[4~" string Prior = "\033[5~" string Next = "\033[6~" string F21 = "" string F22 = "" string F23 = "" string F24 = "" string F25 = "" string F26 = ""
Suppose you save this file as thai.map
. From Linux console, use command loadkeys
to load thai.map
.
You can switch to Thai keyboard by pressing the right Alt key. If you want to switch the keyboard back, press the right Alt key again.
%loadkeys thai.map
You can obtain Thai fonts in bdf format or pcf format from internet. You can also use scalable fonts such as Type1 or TrueType fonts. But I will not describe about these.
You must log in as root. Let's put Thai fonts in /usr/X11R6/lib/X11/fonts/misc/
, this is a default font path. Change directory to /usr/X11R6/lib/X11/fonts/misc/
and run command
If you put Thai fonts in different directory, you must use
%mkfontdir %xset fp rehash
xset
to add the new font path. Please see man-page for further information. You can check the new fonts by running command xlsfonts
and see whether there are Thai fonts or not. If you can not see any Thai fonts from this command, you may need to restart X window.
xmodmap
. Please select how you map Thai keyboard. Irecommend using XKB.Beginning with XFree86 3.1.2D, you can use the new X11R6.1 XKEYBOARD extension to manage the keyboard layout. This is very helpful.
During X server configuration with xf86config
you will be asked about XKB, if you want to to set Thai keyboard layout for your system, say yes. There are a list of pre-configured keymaps. Choose Standard 101-key, Thai encoding.
XF86Setup
is the graphical X server configuration utility for XFree86 X server. It is easier than traditional xf86config
. You can select a keyboard layout easily with this tool.
Ther are many choices of keyboard switch key to select. The default is LeftAlt+RightShift switch to Thai and LeftAlt+LeftShift switch to US. You can type Thai characters in any applications which support ISO-8859-1 character set, but don't forget to use Thai fonts with those applications too.
I found that pre-configured keymaps that came with XFree86-3.2 is not correct. You may not be able to type THO THUNG which located at " 5 key " . To fix this problem, you should add the line
in the file
key <AE05> { [], [ paragraph, ocircumflex ] };
/usr/X11R6/lib/X11/xkb/symbols/th
as the example.
You can not type SORUSI also. Please change the line from
................. key <AE03> { [], [ minus, ograve ] }; key <AE04> { [], [ Agrave, oacute ] }; key <AE05> { [], [ paragraph, ocircumflex ] }; key <AE06> { [], [ Ooblique, Ugrave ] }; key <AE07> { [], [ Odiaeresis, ssharp ] }; .................
to
key <AC08> { [], [ Ograve, eacute ] };
Note that eacute is equal to MAITHO and Eacute is equal to SORUSI.
key <AC08> { [], [ Ograve, Eacute ] };
There are also XKB extension utilities such as setxkbmap
, xkbcomp
, etc. Please see man-page for more information. I recommend to use xkbvled
. The leds will be on when you are using Thai keyboard so you can know your keyboard's status.
The following is part of XF86Config
file about keyboard section. If you want to configure the keyboard by hand, change the content of /usr/X11R6/lib/X11/XF86Config
as an example below. This configuration uses the default toggle key.
Section "Keyboard" Protocol "Standard" AutoRepeat 500 5 LeftAlt Meta RightAlt Meta ScrollLock Compose RightCtl Control # XkbDisable XkbKeycodes "xfree86" XkbTypes "default" XkbCompat "default" XkbSymbols "us(pc101)" XkbGeometry "pc" XkbRules "xfree86" XkbModel "pc101" XkbLayout "th" EndSection
If you use XKB extension, Thai keyboard mapping with xmodmap
may not work. See XF86Config
man-page for mor information.
You can use the utility xmodmap
to map Thai keyboard. Normally xmodmap
is used to load a keyboard configured file. For most Linux distributions, when you start X window with startx
, X server will find .Xmodmap
in /usr/X11R6/lib/X11/xinit/
first. If .Xmodmap
does not exist, X server will find .Xmodmap
in your home directory. Please see the content of /usr/X11R6/lib/X11/xinit/xinitrc
.
The following is the sample of .Xmodmap
for Thai Kedmanee keyboard layout.
Just put
! ! Linux/XFree86 Thai Kedmanee layout (based on US keyboard) ! Use ScrollLock to switch to Thai keyboard. ! This file will work with XFree86 only. ! keycode 0x09 = Escape keycode 0x43 = F1 keycode 0x44 = F2 keycode 0x45 = F3 keycode 0x46 = F4 keycode 0x47 = F5 keycode 0x48 = F6 keycode 0x49 = F7 keycode 0x4A = F8 keycode 0x4B = F9 keycode 0x4C = F10 keycode 0x5F = F11 keycode 0x60 = F12 keycode 0x6F = Print keycode 0x4E = Mode_switch XF86ModeLock keycode 0x6E = Pause keycode 0x31 = grave asciitilde minus percent keycode 0x0A = 1 exclam 0x0e5 plus keycode 0x0B = 2 at slash 0x0f1 keycode 0x0C = 3 numbersign underscore 0x0f2 keycode 0x0D = 4 dollar 0x0c0 0x0f3 keycode 0x0E = 5 percent 0x0b6 0x0f4 keycode 0x0F = 6 asciicircum 0x0d8 0x0d9 keycode 0x10 = 7 ampersand 0x0d6 0x0df keycode 0x11 = 8 asterisk 0x0a4 0x0f5 keycode 0x12 = 9 parenleft 0x0b5 0x0f6 keycode 0x13 = 0 parenright 0x0a8 0x0f7 keycode 0x14 = minus underscore 0x0a2 0x0f8 keycode 0x15 = equal plus 0x0aa 0x0f9 keycode 0x33 = backslash bar 0x0a3 0x0a5 keycode 0x16 = BackSpace keycode 0x6A = Insert keycode 0x61 = Home keycode 0x63 = Prior keycode 0x4D = Num_Lock keycode 0x70 = KP_Divide keycode 0x3F = KP_Multiply keycode 0x52 = KP_Subtract keycode 0x17 = Tab keycode 0x18 = q Q 0x0e6 0x0f0 keycode 0x19 = w W 0x0e4 quotedbl keycode 0x1A = e E 0x0d3 0x0ae keycode 0x1B = r R 0x0be 0x0b1 keycode 0x1C = t T 0x0d0 0x0b8 keycode 0x1D = y Y 0x0d1 0x0ed keycode 0x1E = u U 0x0d5 0x0ea keycode 0x1F = i I 0x0c3 0x0b3 keycode 0x20 = o O 0x0b9 0x0cf keycode 0x21 = p P 0x0c2 0x0ad keycode 0x22 = bracketleft braceleft 0x0ba 0x0b0 keycode 0x23 = bracketright braceright 0x0c5 comma keycode 0x24 = Return keycode 0x6B = Delete keycode 0x67 = End keycode 0x69 = Next keycode 0x4F = KP_7 keycode 0x50 = KP_8 keycode 0x51 = KP_9 keycode 0x56 = KP_Add keycode 0x42 = Caps_Lock keycode 0x26 = a A 0x0bf 0x0c4 keycode 0x27 = s S 0x0cb 0c0a6 keycode 0x28 = d D 0x0a1 0x0af keycode 0x29 = f F 0x0b4 0x0e2 keycode 0x2A = g G 0x0e0 0x0ac keycode 0x2B = h H 0x0e9 0x0e7 keycode 0x2C = j J 0x0e8 0x0eb keycode 0x2D = k K 0x0d2 0x0c9 keycode 0x2E = l L 0x0ca 0x0c8 keycode 0x2F = semicolon colon 0x0c7 0x0ab keycode 0x30 = apostrophe quotedbl 0x0a7 period keycode 0x53 = KP_4 keycode 0x54 = KP_5 keycode 0x55 = KP_6 keycode 0x32 = Shift_L keycode 0x34 = z Z 0x0bc parenleft keycode 0x35 = x X 0x0bb parenright keycode 0x36 = c C 0x0e1 0x0a9 keycode 0x37 = v V 0x0cd 0x0ce keycode 0x38 = b B 0x0d4 0x0da keycode 0x39 = n N 0x0d7 0x0ec keycode 0x3A = m M 0x0b7 question keycode 0x3B = comma less 0x0c1 0x0b2 keycode 0x3C = period greater 0x0e3 0x0cc keycode 0x3D = slash question 0x0bd 0x0c6 keycode 0x3E = Shift_R keycode 0x62 = Up keycode 0x57 = KP_1 keycode 0x58 = KP_2 keycode 0x59 = KP_3 keycode 0x6C = KP_Enter keycode 0x25 = Control_L keycode 0x40 = Alt_L Meta_L keycode 0x41 = space keycode 0x71 = Alt_R Meta_R keycode 0x6D = Control_R keycode 0x64 = Left keycode 0x68 = Down keycode 0x66 = Right keycode 0x5A = KP_0 keycode 0x5B = KP_Decimal clear Shift clear Lock clear Control clear Mod1 clear Mod2 clear Mod3 clear Mod4 clear Mod5 add Shift = Shift_L Shift_R add Lock = Caps_Lock add Control = Control_L Control_R add Mod1 = Alt_L Alt_R add Mod2 = Mode_switch
.Xmodmap
in your home directory will be OK. When you start X window, X server will load this file.
You can also load .Xmodmap
from command line.
%xmodmap ~/.Xmodmap
In above .Xmodmap
file, US/Thai switch key is assigned to keycode 0x4E (78), Scroll Lock key, with the statement
keycode 0x4E = Mode_switch XF86ModeLock
XF86ModeLock
is the special keysym for XFree86 X server. If you don't add this keysym, you have to hold the scroll lock key while you are typing Thai characters. Note that if you use commercial X server, some keycodes are different. You may have to map keyboard by yourself. See man-pages of X
and xev
for further information.
Note: If you are using XFree86 version 3.1.2D or later, you need to add the line XkbDisable
in keyboard section of XF86Config
file. You may config the keyboard section like the following sample.
Section "Keyboard" Protocol "Standard" AutoRepeat 500 5 LeftAlt Meta RightAlt ModeShift ScrollLock ModeLock RightCtl Compose XkbDisable EndSection