JavaScript的:如何检查是否字符是RTL?([removed] how to check i

2019-06-27 02:51发布

我如何以编程方式检查浏览器将某些字符作为RTL在JavaScript?

也许创造一些透明的DIV,看着这里的文字被置于?

上下文的位。 Unicode的5.2增加阿维斯塔字母的支持。 因此,如果浏览器对Unicode 5.2的支持,它把字符,如U + 10B00作为RTL(目前只有Firefox没有)。 否则,它把这些字符作为LTR,因为这是默认的。

如何以编程方式检查呢? 我写的阿维输入脚本,我想重写比迪烟的方向,如果浏览器是太愚蠢。 但是,如果浏览器支持Unicode,比迪烟的设置不应被覆盖(因为这将允许混合斯陀语和斯拉夫语)。

我现在这样做:

var ua = navigator.userAgent.toLowerCase();

if (ua.match('webkit') || ua.match('presto') || ua.match('trident')) {
    var input = document.getElementById('orig');
    if (input) {
        input.style.direction = 'rtl';
        input.style.unicodeBidi = 'bidi-override';
    }
}

但是,很明显,这将使得脚本可以使用较少的后Chrome和Opera开始支持Unicode的5.2。

Answer 1:

function isRTL(s){           
    var ltrChars    = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF'+'\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF',
        rtlChars    = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC',
        rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');

    return rtlDirCheck.test(s);
};

操场页



Answer 2:

我意识到这是相当长的一段原有人问后,并回答了,但我发现垂直同步的更新是相当有用的,只是想补充一些意见。 我会在他的回答添加评论这一点,但我的名声不够高呢。

取而代之的是正则表达式,从线路零个或多个非LTR字符的开始,然后一个RTL字符的搜索,那岂不是更有意义,从行的开始搜索零个或多个弱/中性字符,然后一个RTL性格吗? 否则,你有不必要的匹配许多RTL人物的潜力。 我会欢迎我弱/中性字符组的一个更彻底的检查,因为我只是用结合LTR和RTL字符组的否定。

此外,不应该字符如LTR / RTL标记,嵌入代码,覆盖被包括在相应的字符的分组?

我想那么最终的代码应该是这个样子:

function isRTL(s){           
    var weakChars       = '\u0000-\u0040\u005B-\u0060\u007B-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u2BFF\u2010-\u2029\u202C\u202F-\u2BFF',
        rtlChars        = '\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC',
        rtlDirCheck     = new RegExp('^['+weakChars+']*['+rtlChars+']');

    return rtlDirCheck.test(s);
};

更新

可能有一些方法来加快上述正则表达式。 使用否定字符类惰性限定符似乎有助于提高速度(上测试http://regexhero.net/tester/?id=6dab761c-2517-4d20-9652-6d801623eeec ,网站需要的Silverlight 5)

此外,如果该字符串的方向性不明,我的猜测是,大多数情况下,字符串将是LTR,而不是RTL和创建isLTR函数将返回结果更快,如果是这样的话,但是作为OP是要求isRTL ,将提供isRTL功能:

function isRTL(s){           
    var rtlChars        = '\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC',
        rtlDirCheck     = new RegExp('^[^'+rtlChars+']*?['+rtlChars+']');

    return rtlDirCheck.test(s);
};


Answer 3:

首先解决在标题中的问题:

有在JavaScript中没有工具,例如用于访问字符的Unicode属性。 你需要找到为宗旨库或服务(恐怕这可能是困难的,如果你需要的东西可靠),或提取从Unicode字符“数据库”的相关信息(文本文件中的特定格式的集合),并编写自己的代码来使用它。

然后在邮件正文中的问题:

这似乎更让人绝望。 但是,因为这很可能是东西谁是知识渊博,知道阿维的用户数量有限,也许不会太糟糕,在适当的方向性的他们的图像一起显示的阿维字符的字符串,并要求用户点击一个按钮,如果顺序是错误的。 而你可以保存在cookie这个选择,使用户需要做的仅此一次(每个浏览器,但它应该是相对短暂的cookie,因为浏览器可能会更新)。



Answer 4:

感谢您的意见,但似乎我这个做自己:

function is_script_rtl(t) {
    var d, s1, s2, bodies;

    //If the browser doesn’t support this, it probably doesn’t support Unicode 5.2
    if (!("getBoundingClientRect" in document.documentElement))
        return false;

    //Set up a testing DIV
    d = document.createElement('div');
    d.style.position = 'absolute';
    d.style.visibility = 'hidden';
    d.style.width = 'auto';
    d.style.height = 'auto';
    d.style.fontSize = '10px';
    d.style.fontFamily = "'Ahuramzda'";
    d.appendChild(document.createTextNode(t));

    s1 = document.createElement("span");
    s1.appendChild(document.createTextNode(t));
    d.appendChild(s1);

    s2 = document.createElement("span");
    s2.appendChild(document.createTextNode(t));
    d.appendChild(s2);

    d.appendChild(document.createTextNode(t));

    bodies = document.getElementsByTagName('body');
    if (bodies) {
        var body, r1, r2;

        body = bodies[0];
        body.appendChild(d);
        var r1 = s1.getBoundingClientRect();
        var r2 = s2.getBoundingClientRect();
        body.removeChild(d);

        return r1.left > r2.left;
    }

    return false;   
}

使用的例子:

Avestan in <script>document.write(is_script_rtl('