Bengali keyboard     «Computing»   «Home»   «Map&Rev»



A letter frequency-based Bengali keyboard layout

Keyboard layouts, for any language, should be laid out based on the frequency of letters. The typewriter keyboard layouts in the erstwhile East Pakistan and in West Bengal are said to have been based on frequency lists. This is also said about the ubiquitous Bijoy overlay, unlike the InScript layout which is obviously graphemically designed. It hardly appears that the layouts said to have followed frequency lists are, in effect, so designed.

In 2013, I worked out a frequency list from a text file of about 15 million characters. With the relative frequency list in hand and documents showing the efficiency and efficacy of the keys on the board, it was not much difficult to devise an overlay optimised to the ease of use and speed.

Bengali keyboard layout
Right-click to Save Image As the layout.

I designed the layout in 2014, updated it in 2015 and made its public release in 2018, also with a Windows executable. Finally, I edited the layout in February 2022 to include to new candidates — Vedic anusvara and sandhi mark — and replaced the Devanagari abbreviation with the new Unicode symbol of Bengali abbreviation.

The xkb symbol file and the installation instruction for a handful of Unix/Linux variants are given below. The Windows binary is up for download further down.

Symbol disambiguation

The dash on the ‘1’ key in AltGr is the figure dash; the dash on the ‘hyphen’ key (normal) is the ASCII hyphen-minus; the dash on the same key in Shift is the (real) minus sign; the dash on the key in Alt-Gr is en dash; the dash on the key in Shift AltGr is em dash; the dash on the slash key in Shift AltGr is the (real) hyphen.

The inverted comma on the ‘3’ key in Shift is the beginning single quotation mark; the comma on the ‘4’ key in Shift is the end single quotation mark; the comma on the ‘full stop’ key in AltGr is the modifier letter apostrophe, which Unicode says should be used as the mark of elision; the inverted comma on the same key in Shift AltGr is the modifier letter turned comma, which is used to write the Arabic letter ʻayn.

The slash on the ‘end bracket’ key in AltGr is the normal slash; and the slash on the same key in Shift AltGr is the fraction slash.

The tick on the ‘2’ key is the prime, minutes and feet symbol; the double tick on the ‘3’ key is the double prime, seconds and inches symbol; and the double-tick on the ‘5’ key is the ditto sign.

The circle on the ‘7’ key in Shift AltGr is the old Bengali currency denominator sixteen; the circle on the ‘8’ key in AltGr is the Bengali abbreviation sign; the circle on the ‘9’ key is the Bengali numeral zero; and the circle on the begnning ‘bracket’ key in Shift AltGr is the degree sign.

The full stop on the open ‘bracket’ key in Shift is the full stop; the full stop on the same key in AltGr is the centered period or midpoint; the full stop on the ‘comma’ key in AltGr is nukta and the two-dots on the same key in Shift AltGr is the combining diaeresis below.

The xkb file

// Bengali keyboard layout // based on letter frequency // abu jar m akkas, 2014 // updated 2015, 2022 partial default alphanumeric_keys xkb_symbols "xbengali" { name[Group1]= "Bangla (Xbengali)"; // row_1 (` =) key <TLDE> { [ 0x10009c4, 0x10009e2, 0x1000980, 0x10009e3 ] }; key <AE01> { [ 0x10009e7, exclam, 0x1002012, 0x10009f4 ] }; key <AE02> { [ 0x10009e8, question, 0x1002032, 0x10009f5 ] }; key <AE03> { [ 0x10009e9, 0x1002018, 0x1002033, 0x10009f6 ] }; key <AE04> { [ 0x10009ea, 0x1002019, 0x10009f3, 0x10009f2 ] }; key <AE05> { [ 0x10009eb, percent, 0x1003003, 0x10009f7 ] }; key <AE06> { [ 0x10009ec, 0x100201c, less, 0x10009f8 ] }; key <AE07> { [ 0x10009ed, 0x100201d, greater, 0x10009f9 ] }; key <AE08> { [ 0x10009ee, asterisk, 0x10009fd, 0x10009fb ] }; key <AE09> { [ 0x10009ef, parenleft, braceleft, bracketleft ] }; key <AE10> { [ 0x10009e6, parenright, braceright, bracketright ] }; key <AE11> { [ minus, 0x1002212, 0x1002013, 0x1002014 ] }; key <AE12> { [ equal, plus, multiply, division ] }; // row_2 (q ]) key <AD01> { [ 0x1000987, 0x1000983, voidsymbol, voidsymbol ] }; key <AD02> { [ 0x10009ae, 0x1000998, voidsymbol, voidsymbol ] }; key <AD03> { [ 0x10009b8, 0x1000999, voidsymbol, voidsymbol ] }; key <AD04> { [ 0x1000964, 0x1000981, 0x1000965, 0x10009fa ] }; key <AD05> { [ 0x1000997, 0x100099d, voidsymbol, voidsymbol ] }; key <AD06> { [ 0x1000986, 0x1000988, voidsymbol, voidsymbol ] }; key <AD07> { [ 0x10009c1, 0x1000989, voidsymbol, voidsymbol ] }; key <AD08> { [ 0x10009ac, 0x10009a1, 0x10009f1, voidsymbol ] }; key <AD09> { [ 0x10009b2, 0x10009a0, 0x100098c, 0x10009e1 ] }; key <AD10> { [ 0x100099c, 0x10009cc, voidsymbol, 0x10009d7 ] }; key <AD11> { [ comma, period, periodcentered, 0x10000b0 ] }; key <AD12> { [ semicolon, colon, slash, 0x1002044 ] }; // row_3 (a \) key <AC01> { [ 0x10009a4, 0x10009a3, voidsymbol, voidsymbol ] }; key <AC02> { [ 0x10009a8, 0x1000985, 0x10009bd, 0x10009fe ] }; key <AC03> { [ 0x10009cd, 0x10009a7, voidsymbol, voidsymbol ] }; key <AC04> { [ 0x10009c7, 0x10009a5, voidsymbol, voidsymbol ] }; key <AC05> { [ 0x10009af, 0x10009dc, voidsymbol, voidsymbol ] }; key <AC06> { [ 0x10009df, 0x1000982, voidsymbol, 0x10009fc ] }; key <AC07> { [ 0x10009be, 0x10009b7, voidsymbol, voidsymbol ] }; key <AC08> { [ 0x10009b0, 0x10009ad, 0x10009f0, voidsymbol ] }; key <AC09> { [ 0x10009bf, 0x1000996, voidsymbol, voidsymbol ] }; key <AC10> { [ 0x1000995, 0x1000993, voidsymbol, voidsymbol ] }; key <AC11> { [ 0x1000994, 0x100098a, voidsymbol, voidsymbol ] }; key <BKSL> { [ 0x100200c, 0x100200d, 0x1002009, 0x10000a0 ] }; // row_4 (z /) key <AB01> { [ 0x100099b, 0x100098b, voidsymbol, 0x10009e0 ] }; key <AB02> { [ 0x100098f, 0x10009a2, voidsymbol, voidsymbol ] }; key <AB03> { [ 0x10009cb, 0x10009c3, voidsymbol, voidsymbol ] }; key <AB04> { [ 0x10009a6, 0x10009c8, voidsymbol, voidsymbol ] }; key <AB05> { [ 0x100099a, 0x10009dd, voidsymbol, voidsymbol ] }; key <AB06> { [ 0x10009b9, 0x10009c2, voidsymbol, voidsymbol ] }; key <AB07> { [ 0x10009aa, 0x100099e, voidsymbol, voidsymbol ] }; key <AB08> { [ 0x100099f, 0x10009ab, 0x10009bc, 0x1000324 ] }; key <AB09> { [ 0x10009b6, 0x1000990, 0x10002bc, 0x10002bb ] }; key <AB10> { [ 0x10009c0, 0x10009ce, 0x1002026, 0x1002010 ] }; key <SPCE> { [ space, space, 0x1002008, 0x100202f ] }; // third level with right-Alt include "level3(ralt_switch)" };


Note: Taka or Rupee — Anyone willing to use the Rupee sign (₹) in place of the Taka sign (৳) should replace the code in red — 0x10009f3, the third number for key <AE04> — with the 0x10020b9 code for the Rupee sign.



The symbol file for the keyboard, copied and pasted into the xben file, needs to be put in the /usr/local/share/X11/xkb/symbols directory on FreeBSD. The following code snipped should be added to the bd file for Bangladesh or to the in file for India.

// xben addition xkb_symbols "xbeng" { include "xben(xbengali)" name[Group1]= "Bangla (Xbengali)"; };

The keyboard layout needs to be listed in base.lst and evdev.lst files, by adding the following line to both the files.

xbeng bd: Bangla (Xbengali)

The next step is to update both the base.xml and the evdev.xml file with the following snippet inserted between <variantList> and </variantList> in the <name>bd</name> or <name>in</name> section of the <layout>.

<variant> <configItem> <name>xbeng</name> <description>Bangla (Xbengali)</description> </configItem> </variant>

I needed to install ‘Keyboard layout switching plugin for the Xfce panel’ (xfce4-xkb-plugin-0.8.2_1) to switch between keyboards loaded, four at a time.

There may be variation in how to install and load the symbol files in systems other than FreeBSD. Still, the same symbol file should work.


After the symbol file is put into the symbol directory (/etc/X11/xkb/symbols), the file needs to be added to the xkb symbol file with addition of the code snippet below for the country intended — for Bangladesh, bd, or for India, in.

// XKBben xkb_symbols "xkbben" { include "xkbben(xkbengali)" name[Group1]= "Bangladesh - XKBben"; };

Alternatively, if this layout should be the only layout needed, the symbol file could be renamed as bd, after backing up the original (shipped) file should occasions arise that it is needed in future.

The following snippet

<configItem> <name>xkbben</name> <description>XKB Bengali</description> <shortDescription>bn</shortDescription> <languageList><iso639Id>ben</iso639Id></languageList> </configItem> </variant> --------------- --------------- </variantList> </layout>

needs to be inserted in the following bd section of the evdev.xml, <variantList> and </variantList> anywhere as a variant, that resides on /etc/X11/xkb/rules

<layout> <configItem> <name>bd</name> <shortDescription>bn</shortDescription> <description>Bengali</description> <languageList> <iso639Id>ben</iso639Id> </languageList> </configItem> <variantList> <variant>

Note: I am not certain about this, but in the early 2010s, I needed to compile the symbol file by issuing the following command under /etc/X11/xkb

xkbcomp -lhlpR '*' ,,/symbols.dir [Enter]

The keyboard layout can be selected from >system settings | input device | keyboard, add Bengali as the language, Bengali (Bangladesh) as the layout and xkb Bengali as the variant. A restart of the x-window may be required.


On Debian, the xkb file resides in the /usr/share/X11/xkb/symbols/ directory. The selection procession depends on the desktop environment. On lxde, the layout needs to be selected from panel settings | panel applets | keybaord layout handler.

Red Hat Linux

The following five lines of code should be added to the xkb symbol file for the country intended — for Bangladesh, bd, or for India, in.

// XKBben xkb_symbols "xkbben" { include "xkbben(xkbengali)" name[Group1]= "Bangladesh - XKBben"; };

Into the symbols directory, the following command

xkbcomp -lhlpR '*' -o ../symbols.dir

should be issued for the rest of the processing. In the windowing environment, the keyboard could be selected from the KDE Control Menu by issuing the command


The binary for the version with the Taka sign can be downloaded from here and the version with the Rupee sign can be downloaded from here.


Rev.: vii·xi·mmxxii