问题是'.' 字符为'定向中性字符',表示从下一个强定向字符中获取方向,如果后面没有字符,则从容器中获取。在你的情况下,它是后一种。正如已经发现的,一种解决方案是使容器从右到左。但还有其他两种解决方案:
1-在“。”之后放置另一个不可见的从右到左方向性的强字符。幸运的是,unicode 有一个特殊字符,即“从右到左标记”(U+200F)
2-将“从右到左的覆盖字符”(U + 202E)放在文本之前,因此在此标记之后任何中性字符都会获得从右到左的方向。您可以通过添加“弹出方向格式”字符 (U+202C) 来结束覆盖。
我更改了@shervin 的示例代码来演示它。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<canvas id="myCanvas" width="700" height="250" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.
</canvas>
<script type="text/javascript" charset="utf-8">
var c = document.getElementById("myCanvas");
var cArabic = c.getContext("2d");
cArabic.font="20px Arial";
//option 1 : adding right-to-left mark at the end to put the '.' between two strong right to left charachters, so it will treated as right to left.
var str1 = "این یک آزمایش است." + "\u200F";
//option 2 : adding right-to-left override at the begining of the text so every neutral charachter afterward becomes righ to left.
var str2;
str2 = "\u202E";
str2+= "این یک آزمایش است.";
// you might want to finish the override by 'pop directional formatting' charachter
str2 += "\u202C";
cArabic.fillText(str1, 200, 30);
cArabic.fillText(str2, 200, 70);
</script>
</body>
</html>
结果图片
还有其他解决方案。您可以在此页面的 unicode 规范中找到它们。它们是在 Chrome 中存在渲染问题的“方向隔离”(U+2067)。和 U+202B 的“方向嵌入”,类似于方向覆盖。