I have devised a workaround. Although it may not be the most elegant solution, it gets the job done.
The basic idea is that whenever the "i" key is pressed within the input field, we intercept the action and substitute it with our custom character.
// Taken from Stack Overflow: http://stackoverflow.com/a/1064139/2205195
function insertAtCaret(elem,text) {
var txtarea = elem;
var scrollPos = txtarea.scrollTop;
var strPos = 0;
var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?
"ff" : (document.selection ? "ie" : false ) );
if (br == "ie") {
txtarea.focus();
var range = document.selection.createRange();
range.moveStart ('character', -txtarea.value.length);
strPos = range.text.length;
}
else if (br == "ff") strPos = txtarea.selectionStart;
var front = (txtarea.value).substring(0,strPos);
var back = (txtarea.value).substring(strPos,txtarea.value.length);
txtarea.value=front+text+back;
strPos = strPos + text.length;
if (br == "ie") {
txtarea.focus();
var range = document.selection.createRange();
range.moveStart ('character', -txtarea.value.length);
range.moveStart ('character', strPos);
range.moveEnd ('character', 0);
range.select();
}
else if (br == "ff") {
txtarea.selectionStart = strPos;
txtarea.selectionEnd = strPos;
txtarea.focus();
}
txtarea.scrollTop = scrollPos;
}
$(".js-filter").keydown(function(event){
if (event.which == 73) {
event.preventDefault();
insertAtCaret($(this)[0], "İ");
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="js-filter form-control" type="text" value="" style="text-transform:Uppercase">
Here's a link to a jsFiddle demo in case you prefer it.
Regrettably, I was unable to locate a straightforward CSS solution, but rest assured that this method should serve its purpose effectively.