我正在尝试为一些字符串格式代码编写单元测试。在某些情况下,格式化输出可能包含双向文本,即从左到右和从右到左的混合。
我已经凭经验验证了在 Android 设备或模拟器上运行时,对于 LTR 和 RTL 输入和输出的所有组合,输出看起来都是正确的。不过,我正在努力在单元测试中捕捉到这一点;我不确定如何在测试用例中正确指定预期输出。
例如,我想断言返回的字符串将像这样呈现:
-?.?.123,456.78
也就是说,字形应该按照从左到右的顺序出现:
-
1
2
3
,
4
5
6
.
7
8
.
?
.
?
(您不知道在 SO 编辑框中将其编辑成正确的序列是多么困难!)
我在测试用例中尝试使用标准字符串比较方法,如下所示:
assertEquals("-?.?.123,456.78", formattedOutput);
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为测试代码中的预期输出字符串对其文本进行了重新排序。事实上,根据我用来查看源代码的工具(Android Studio 与 Github-with-Chrome),它在源代码中的外观甚至有所不同,所以我不相信它正在测试正确的东西。
我还尝试逐步构建预期输出值,以避免在编辑器中出现混淆,尽管它会导致在引擎盖下构造相同的字符串文字:
assertEquals("-123,456.78" + SYMBOL, formattedOutput);
Run Code Online (Sandbox Code Playgroud)
如何比较字形的视觉顺序,而不是逻辑顺序?Android 会BidiFormatter
在这里帮助我吗?
我有一个任务,通过使用某种库来修改 css,向网站添加 rtl 支持,该库将从左到右交换,反之亦然,并将 [dir=rlt] [dir=ltr] 相应地附加到所有选择器。
到目前为止我所做的:
可能的解决方案:
目前,我正在尝试寻找工作处理器,但没有运气。
对于如何实现这一目标有什么想法吗?
换行和 Unicode 双向算法的要求造成了先有鸡还是先有蛋的问题:
1) UBA 要求在将文本分割成行后重新排序。
2)为了使用任何换行算法将文本分割成行,需要知道不包括第一个单词之前和最后一个单词之后的空白的行的宽度。但为此,需要知道单词的视觉顺序,以便知道要删除哪个空白。但根据 UBA,必须在换行之后单独计算每行的 RTL/LTR 段的视觉顺序。
这个问题在概念上和实践中是如何解决的(例如在 chrome、openoffice 等中)?
我正在尝试将阿拉伯文字绘制到位图上以供显示:
Bitmap img = Bitmap.createBitmap( (int) f+100, 300, Config.RGB_565);
Canvas c = new Canvas();
c.setBitmap( img );
mFace = Typeface.createFromAsset(getAssets(),"DejaVuSansCondensed.ttf");
mPaint.setTypeface(mFace);
content = "????";
content = ArabicUtilities.reshape( content );
System.out.println("Drawing text: " + content);
c.drawText(content, 30, 30, mPaint);
Run Code Online (Sandbox Code Playgroud)
ArabicUtilities类是一个重塑unicode文本的工具,因此字母是连接的.请参阅:http://github.com/agawish/Better-Arabic-Reshaper/
但是,生成的位图如下所示:
alt text http://imagebin.ca/img/J1EB8DWc.jpg
它应该看起来像يجري
我相信这个问题是因为,与TextView不同,Bitmap类不支持BiDi,所以它从左边开始绘制字母.
尽我所能,我无法弄清楚如何以正确的顺序绘制文本.
我需要在打印前知道文本的方向.
我正在使用Unicode字符.
我怎么能用C++做到这一点?
我有一个<canvas>
我想呈现从右到左的字符串(例如,在中间某处带有一些英语单词的希伯来语句子)。
对于整个画布,dir
可以指定一个属性。所以,在我的例子中,我会使用<canvas dir="rtl />
.
不幸的是,这个解决方案远未完成。我在同一个应用程序中有一些 LTR 句子(例如,只有英语,或者英语中间有一些希伯来语,但不是相反的)。
dir
不使用两个或多个<canvas>
es 的情况下指定每个字符串的基础?这是dir
属性如何以这种方式canvas
处理双向字符串的简单示例:
var text = '??? text ??????'
var rtlCanvas = document.getElementById('rtl-canvas')
var rtlCtx = rtlCanvas.getContext('2d')
rtlCtx.font = '24px Arial'
rtlCtx.fillText(text, 250, 50)
var ltrCanvas = document.getElementById('ltr-canvas')
var ltrCtx = ltrCanvas.getContext('2d')
ltrCtx.font = '24px Arial'
ltrCtx.fillText(text, 0, 50)
Run Code Online (Sandbox Code Playgroud)
<div>
<p>Looking good with dir=rtl:</p>
<canvas id="rtl-canvas" dir="rtl" width=300 height=100/>
</div>
<div>
<p>With dir=ltr, first and last words are swapped</p> …
Run Code Online (Sandbox Code Playgroud)我正在学习用于网络的 Clojure。我正在尝试在 Lein 应用程序中实现 Bidi 和 Ring。当我打开该网站时,出现 500 错误:
HTTP 错误:500
访问 / 时出现问题。原因:
响应图为零
由码头提供支持:://
我的文件如下:
./project.clj
(defproject bidi-ring "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.10.0"]
[bidi "2.1.6"]
[ring/ring-core "1.6.3"]
[ring/ring-jetty-adapter "1.6.3"]]
:repl-options {:init-ns my.app}
:main my.app)
Run Code Online (Sandbox Code Playgroud)
./src/my/handler.clj
(ns my.handler (:gen-class)
(:require [bidi.ring :refer (make-handler)]
[ring.util.response :as res]))
(defn index-handler
[request]
(res/response "Homepage"))
(defn article-handler
[{:keys [route-params]}]
(res/response (str "You are viewing article: " (:id route-params))))
(def …
Run Code Online (Sandbox Code Playgroud) .red {
color: red;
direction: rtl;
}
.green {
color: green;
direction: rtl;
}
p {
direction: ltr;
}
Run Code Online (Sandbox Code Playgroud)
<p>Example:
1. <span class="red">????????? ????????</span>
2. <span class="green">???????? ?? ???? ?????</span>
</p>
Run Code Online (Sandbox Code Playgroud)
上面的 HTML 和 CSS 呈现如下:
请注意,在 HTML 中,从左到右的顺序中,“红色”在“绿色”之前,而渲染已将它们交换。
如果我替换“2”。对于任何拉丁字母,跨度会交换到正确的位置。
如何让两个跨度(以及 的所有直接子项<p>
)以从左到右的顺序出现?
首选仅使用 CSS 的解决方案。
我想在Canvas上打印从右到左的Unicode字符串.我找不到BidiMode属性或类似的东西来完成它.
当前位于字符串末尾的符号出现在"画布"上打印的文本的第一个字符之前.
我试图通过以下功能设置TListView
控制方向RTL
:
procedure RTL_LV(lv:TListView);
const
LVM_FIRST = $1000;
LVM_GETHEADER = LVM_FIRST + 31;
var
header: THandle;
begin
header:= SendMessage (lv.Handle, LVM_GETHEADER, 0, 0);
SetWindowLong (header, GWL_EXSTYLE,
GetWindowLong (header, GWL_EXSTYLE) or
WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);
SetWindowLong (lv.Handle, GWL_EXSTYLE,
GetWindowLong (lv.Handle, GWL_EXSTYLE) or
WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);
lv.invalidate;
end;
Run Code Online (Sandbox Code Playgroud)
但是当项目使用时,我有两个问题如下VCL Styles
:
1:Vertical scrollbar
没有点击它就不会出现.
2:当我更改ListView列的大小并horizontal scrollbar
单击时,将显示以下错误消息:
例外来源: Vcl.ComCtrls.TListViewStyleHook.WMMouseMove
procedure TListViewStyleHook.WMMouseMove(var Message: TWMMouse);
var
SF: TScrollInfo;
SPos: Integer;
R: TRect;
begin
if VertSliderState = tsThumbBtnVertPressed then
begin …
Run Code Online (Sandbox Code Playgroud)