如何检测文本域中输入的文本是否为RTL

19

我有一个文本框,用户可以输入英语(或任何其他从左到右的语言)或RTL语言。

当用户使用RTL语言书写时,必须按下右Shift + Ctrl才能使文本对齐到右侧且为RTL。然而,在Windows(和可能其他现代操作系统中),用户可以设置任何按键组合来切换语言和文本方向。

我知道如何将文本显示为RTL,但如何知道应该显示哪个方向?

是否有一种方法可以检测在文本框/文本域中键入的文本是以RTL方式键入的?


有特定的Unicode字符用于指示所谓的BiDi模式中的文本方向,但在您的情况下是否适用我不知道。 - didierc
这些字符是否包含在文本区域中保存的实际文本中? - Nick Ginanto
这意味着文本区域应该是Unicode而不是UTF-8,对吗? - Nick Ginanto
utf-8是Unicode的一个实例,因此它应该可以工作。 - didierc
请问如何在Python中检查文件是否存在? - vsync
显示剩余3条评论
3个回答

42

嘿,谢谢。我知道那个解决方案,它还很新,而且并不是所有的浏览器都实现得很好(Firefox 22 开始处理它)。 - Nick Ginanto
谢谢,好知道。如果有人找到支持表格,也请告诉我! - s3v3n
您可以在http://www.w3.org/International/tests/html5/the-dir-attribute/results-dir-auto中查看摘要表。 - Nick Ginanto
2
它不支持IE 11。 - Iman Mahmoudinasab
1
已在 Cordova 应用程序中进行了测试,运行得非常好。 - Farzad Yousefzadeh
显示剩余2条评论

13

试试这个:

var rtl_rx = /[\u0591-\u07FF]/;
$('textarea').on('keyup',function(){
    this.style.direction = rtl_rx.test(this.value) ? 'rtl' : 'ltr';
});

我使用了一个简化的正则表达式来检测RTL

/[\u0591-\u07FF]/

尽管它可能无法捕获Unicode表中的每个RTL字符,但它很可能涵盖了所有实际情况。它包括所有普通的希伯来语和阿拉伯语字符,包括表示元音的字符。


1
just use dir="auto" - M00HY

1
你可以使用正则表达式编写快速的JavaScript/jQuery代码。不过,在JavaScript中,正则表达式受到限制,因此您需要使用XRegExp库,该库具有完整的Unicode支持 - 如果您添加插件。然后,您可以使用类似于\p{Hebrew}这样的表达式来检查字符所属的Unicode块。http://www.regular-expressions.info/unicode.html 面临相同的困境,我编写了一个函数,循环遍历每个字符串中的字符,并计算希伯来字符的出现次数(我的网站是双语的意第绪语/英语)。然后字符串得分,并向具有高分的元素应用“rtl”类。您可以轻松地将所有Unicode中的RTL语言添加到for循环中,以使其更通用。

http://jsfiddle.net/Swyu4/9/

请注意在jsfiddle中链接到XRegExp库的外部资源。
$('p').each(function() {
    if(isRTL($(this).text()))
        $(this).addClass('rtl');
});

function isRTL(str) {
    var isHebrew = XRegExp('[\\p{Hebrew}]');
    var isLatin = XRegExp('[\\p{Latin}]');
    var partLatin = 0;
    var partHebrew = 0;
    var rtlIndex = 0;
    var isRTL = false;

    for(i=0;i<str.length;i++){
        if(isLatin.test(str[i]))
            partLatin++;
        if(isHebrew.test(str[i]))
            partHebrew++;
    }
    rtlIndex = partHebrew/(partLatin + partHebrew);
    if(rtlIndex > .5) {
        isRTL = true;
    }
/*
console.log('Latin score: ' + partLatin);
console.log('Hebrew score: ' + partHebrew);
console.log('trlIndex score: ' + rtlIndex);
console.log('isRTL: ' + isRTL);
*/

    return isRTL;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接