我正在尝试在HTML5 Canvas'2d Context上使用fillText()方法来绘制用阿拉伯语编写的字符串。它完美无缺,直到我在字符串的末尾加上一个标点符号。然后标点符号出现在字符串的错误一侧(在开头,而不是结尾,就好像它是一个不是rtl字符串的ltr)。我使用了Context.textAlign属性,但这似乎只涉及相对于指定位置绘制字符串的方式,而不是文本的实际方向。有谁知道解决这个问题?
感谢。
更新:我找到的答案是在页面的canvas元素中添加“dir”属性。例如,
<canvas dir="rtl">
但是,我仍然不知道如何更改发送到fillText的单个字符串的dir属性。有什么想法吗?
答案 0 :(得分:9)
您无需为每个字符串设置方向。请参阅以下示例,该示例还显示了正确显示顺序的隐式bidi控制标记的正确使用:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<canvas id="myCanvas" width="700" dir="rtl" 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="25px Arial";
// Simple Sentence with punctuation.
var str1 = "این یک آزمایش است.";
// Few sentences with punctuation and numerals.
var str2 = "۱ آزمایش. 2 آزمایش، سه آزمایش & Foo آزمایش!";
// Needs implicit bidi marks to display correctly.
var str3 = "آزمایش برای Foo Ltd. و Bar Inc. باشد که آزموده شود.";
// Implicit bidi marks added; "Foo Ltd.‎ و Bar Inc.‎"
var str4 = "آزمایش برای Foo Ltd. و Bar Inc. باشد که آزموده شود.";
cArabic.fillText(str1, 600, 60);
cArabic.fillText(str2, 600, 100);
cArabic.fillText(str3, 600, 140);
cArabic.fillText(str4, 600, 180);
</script>
</body>
</html>
这是输出:
答案 1 :(得分:2)
设置dir选项适用于整个画布 - 对于表现不佳的单个字符串,您可以考虑在引用后手动添加RTL标记(U + 200F)。
答案 2 :(得分:0)
你可以这样做:
ctx.textAlign = “结束”;
或
ctx.textAlign =“right”
并从左到右再次制作:
ctx.textAlign = “开始”;
答案 3 :(得分:0)
问题在于'。'字符是'方向中性字符',它表示它从下一个强方向字符获取方向,如果之后没有字符,则从容器中获取它。在你的情况下,它是后者。如已经发现的,一种解决方案是使容器从右到左。但仍有两个其他解决方案:
1-在'。'之后放置另一个看不见的强大的从右到左的方向字符。幸运的是,unicode有一个特殊字符,即“从右到左标记”(U + 200F)
2-在文本之前放置“从右到左覆盖字符”(U + 202E),因此在此标记之后,任何中性字符都会从右向左方向。您可以通过添加“pop direction formatting”字符(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>
还有其他解决方案。您可以在page中以unicode规范找到它们。它们是“方向隔离”(U + 2067),它在Chrome中存在渲染问题。与U + 202B“方向嵌入”,类似于方向覆盖。