为什么后面的标点符号在开头显示为方向:rtl



这更多的是一种好奇心。在开发多语言web应用程序时,我注意到块元素末尾的某些字符,如标点符号(!?.;,),在书写方向为从右到左时(就像我不说的某些亚洲语言一样),会被呈现为放在开头。

换句话说,字符串

Hello, World!

呈现为

!Hello, World

当放置在具有direction: rtl的div块中时

如果文本被分成两部分并赋予不同的颜色,这一点就会变得更加明显:结尾的连续文本块被呈现在两个分离的区域中:

http://jsfiddle.net/22Qk9/

这种行为有什么意义?我想这一定是(所有?)从右到左语言的一个特点,它是由浏览器自动处理的,所以我不需要关心它,或者我应该关心它吗?

如果要修复此行为,请在末尾添加LRM字符‎。这是一个非打印字符。

来源:http://dotancohen.com/howto/rtl_right_to_left.html

示例:http://jsfiddle.net/yobjj6ed/

原因是感叹号"!"具有BiDi类O.N.('Other Neutrals'),这意味着它可以有效地适应周围文本的方向性。因此,在本例中,它被放在前面文本的左侧。这对于从右到左书写的语言来说是非常正确的:终止标点符号出现在末尾,即左侧。

通常,对于从右到左书写的语言中的文本,您使用CSS代码direction: rtl,或者最好使用HTML属性dir=rtl,并且仅用于它们。对他们来说,这种行为是一种解决方案,而不是问题。

如果您使用direction: rtldir=rtl只是为了获得特殊效果,比如使表列从右到左排列,那么您需要考虑其含义。例如,在表格的情况下,您需要将表格中每个单元格的方向设置为ltr(除非您希望它们主要呈现为从右到左的文本)。

例如,如果你在一块阿拉伯语文本中引用了一个英语句子,那么你需要将包含英语文本的元素的方向性设置为ltr,例如

<blockquote dir=ltr>Hello, World!</blockquote>

W3C文档中的用例6讨论了一个类似的情况(英语文本中只有阿拉伯语)。关于bidi算法和内联标记,您需要了解什么(尽管有一些奇怪之处,比如对引用的文本使用cite标记,而不是W3C的建议)。

接受的答案https://stackoverflow.com/a/20799360/477420若您可以控制值的标记/CSS,若您不能控制HTML,以下方法就可以工作。

如果您不知道页面是RTL还是LTR,但某些文本肯定是LTR(即仅英文),您可以用LRE/PDF标记将该值包装起来,表示它是LTR区域。无论页面的LTR或RTL方向如何,文本都将呈现LTR。

当您有一些代码试图呈现文本,却无法更改文本在页面上的确切显示方式的标记时,这种方法就会起作用。也就是说,您在一些嵌套的子组件(或服务器端)中呈现"歌曲平铺"或"公司名称"字段的值,而无法控制周围的HTML元素。

这种方法和类似方法(如本问题中的LRM建议)在文本中添加标记的一个缺点是,从生成的HTML页面中复制粘贴这样的值通常会保留标记,但它们不可见/宽度为零。虽然在大多数情况下,考虑一下这是否是你的问题是可以的。

近似示例代码(一些公司在结尾处有"股份有限公司",当在RTL页面上呈现为i时,该代码将在开头处加上句点):

// comanyName = "Alphabet Inc." - really likes dot at the end including RTL
if(stringIsDefinitelyAscii(companyName))
{
companyName = "u202A" + companyName + "u202C"
}
return companyName;

有关LRE/PDF符号的详细信息,请参阅https://unicode.org/reports/tr9/#Explicit_Directional_Embeddings:

LRE U+202A左右嵌入式将以下文本视为从左到右嵌入。

PDF U+202C POP方向格式化结束最后一个LRE、RLE、RLO或LRO的范围。

在"如何检测字符是否属于从右到左语言?"中可以找到一些确定字符串是否具有RTL字符的方法?,JavaScript:如何检查字符是否为RTL?,如何检测字符串是否包含从右到左的字符?。

最新更新