在 WPF 中设置“语言”属性时遇到奇怪的事情:
- 在窗口或文本框/文本块上将 FlowDirection 设置为“RightToLeft”
- 将语言属性设置为“fa-IR”
- 将文本设置为以下示例文本之一(A,B)
A. 此文本在 WPF 3.5中无法正确呈现:
联系方式: +44 1908 215040
它适用于 WinForms 和 Silverlight。请注意,它包含一个“从左到右的标记”(U+200E)
这是上面的 HTML 版本,带有对 LRM 的数字字符引用,以可视化 LRM 的插入位置:
فاکس: ‎+44 1908 215040
B. 此文本确实在 WPF 中正确呈现:
答案: +44 1908 210210
但它包含(我相信)不必要的 LRM 字符。我以反复试验的方式将文本放在一起。
这是带有额外 LRM 字符的 HTML 版本
فاکس: ‎+‎44‎ ‎1908‎ ‎215040‎
为什么需要额外的字符/我在原始文本中做错了什么?
注意:问题发生在 IFF 设置 Language 属性时,无论是在 XAML 或代码中显式(如 Language="fa-IR")还是通过覆盖代码中 Language 属性的默认值(假设当前区域性为“fa-IR”)像这样:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
如果我将语言属性保留为 en-US,则文本会在 WPF 中正确呈现,但我确实需要设置语言以使值转换工作,而不必在每个可能绑定到某些数据的数据绑定上显式设置 ConverterCulture文化相关数据。
还有其他问题,例如 LRO ('LEFT-TO-RIGHT OVERRIDE' (U+202D)) 被忽略。
我真的需要帮助来了解正在发生的事情,因为这可能会成为将我的应用程序本地化为波斯语和阿拉伯语的阻碍。
我怀疑我是做错事的人,因为我没有用谷歌搜索这个问题。这是 MS Connect 上的相关帖子,但到目前为止还没有人确认该行为是一个错误:
http://connect.microsoft.com/WPF/feedback/details/682784/incorrect-unicode-bidi-behaviour#
注意:我对 BiDi 算法一般不太熟悉,对 WPF 中的实际实现知之甚少。我对Unicode有基本的了解。