我正在尝试使用名为bidi的Python包.在这个包中的模块(algorithm.py)中,有一些行给出了错误,尽管它是包的一部分.
以下是这些行:
# utf-8 ? we need unicode
if isinstance(unicode_or_str, unicode):
text = unicode_or_str
decoded = False
else:
text = unicode_or_str.decode(encoding)
decoded = True
Run Code Online (Sandbox Code Playgroud)
这是错误信息:
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
bidi_text = get_display(reshaped_text)
File "C:\Python33\lib\site-packages\python_bidi-0.3.4-py3.3.egg\bidi\algorithm.py", line 602, in get_display
if isinstance(unicode_or_str, unicode):
NameError: global name 'unicode' is not defined
Run Code Online (Sandbox Code Playgroud)
我应该如何重写这部分代码,以便它在Python3中工作?如果有人使用Python 3的bidi包,请告诉我他们是否发现了类似的问题.我感谢您的帮助.
您可能知道某些语言是从右到左编写/读取的,我们正在尝试支持某些RTL语言.对于在HTML中使用dir ="rtl"的Web UI,大部分工作都归功于浏览器所具有的算法.但是我在文本中用括号来解决这个问题:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Bracket problems with BiDi</title>
</head>
<body>
<p style="direction: rtl;">Bracket problem: hello (world):</p>
<p style="direction: rtl;">No bracket problem: hello (world) something:</p>
<p style="direction: rtl;">Bracket problem: (?????? (????? </p>
<p style="direction: rtl;">No bracket problem: ?????? (?????) ????? </p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
问题可以在这里看到: 截图
所以我希望最后一个支架留在最后.你的解决方案是什么?
什么是判断字符串是否包含"从右到左"语言的文本的好方法.
我发现这个问题表明了以下方法:
public bool IsArabic(string strCompare)
{
char[] chars = strCompare.ToCharArray();
foreach (char ch in chars)
if (ch >= '\u0627' && ch <= '\u0649') return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
虽然这可能适用于阿拉伯语,但这似乎不包括其他RTL语言,如希伯来语.有没有通用的方法来知道某个特定字符属于RTL语言?
我可以在MS Word或Notepad上写阿拉伯语/乌尔都语/波斯语就好了,但每当我插入任何英文单词或数字时,序列就会受到干扰,看起来所有的单词都在句子中被洗牌了.
看下面的例子:
?? ??? ???? ?? ???? ?? ...
Run Code Online (Sandbox Code Playgroud)
现在我插入了一个英文单词,它变为:
?? ??? ???? ??word ???? ?? ...
Run Code Online (Sandbox Code Playgroud)
所以你可以看到几乎所有的单词都被混淆了......解决方法是什么?
因此,电话号码始终是ltr(从左到右).
在多语言网站上工作我需要在一个带有方向rtl的文本段落中插入一个电话号码(带有'+'前缀和数字用' - '分隔)(当然对于相关语言)
所以我有这样的事情:
.ltr #test {direction:ltr}
.rtl #test {direction:rtl}
#phone {direction:ltr}
Run Code Online (Sandbox Code Playgroud)
<div class="ltr"><p id="test">Please call to <span id="phone">+44-123-321</span> for some help.</p></div>
<div class="rtl"><p id="test">Please call to <span id="phone">+44-123-321</span> for some help.</p></div>
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,因为' direction
'仅适用于块元素,' span
'是内联元素.我需要电话号码在段落内,所以我不能改变' span
'到' display:inline
'
我很清楚?
如何使它工作?
我正在研究基于文本方向动态更改UI的可行性.虽然Google支持RTL语言(参考:Android 4.2中的Native RTL支持),但它不包括应用程序混合了LTR和RTL内容的情况.
谷歌的解决方案是正确的,如果我们有多语言应用程序,它有不同语言的不同静态数据源(如菜单项).但是,我没有找到任何其他文档关于如何根据文本内容的方向动态更改布局.
下图显示了我的测试应用程序的当前设计.列表来自Facebook(我的朋友列表),包含英文和波斯名字.
我的解决方案是在适配器中有两个布局(一个用于LTR,一个用于RTL),并根据名称的方向分配每个布局.所以,我写了以下几行代码:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(position % 2 == 0)
convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
else
convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);
holder = new ViewHolder();
holder.llSection = (LinearLayout) convertView.findViewById(R.id.section);
holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName);
holder.ivPicture = (ImageView) convertView.findViewById(R.id.ivPicture);
holder.btnAdd = (Button) convertView.findViewById(R.id.btnAdd);
convertView.setTag(holder);
holder.btnAdd.setTag(position);
holder.tvUserName.setText(userList.get(position).getName());
imageDownloader.displayImage(holder.ivPicture, userList.get(position).getPhotoUrl());
...
return convertView;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
我根据行是偶数还是奇数来镜像行.现在,我的问题是如何根据名称镜像UI.我想我应该将条款条件if(position % 2 == 0)
改为类似的条件if(isNameLTR(FIRST_CHAR_OF_NAME))
.我不知道如何实现这个方法.
我怎么知道一个角色是LTR还是RTL?(我认为Android知道单词的第一个字符是RTL或LTR,这就是为什么当文本视图的宽度与父级匹配时,如果字符是RLT则将文本对齐到右边,如果字符是LTR则向左对齐).
任何建议或意见将不胜感激.谢谢
如何以编程方式检查浏览器是否将某些字符视为JavaScript中的RTL?
也许创建一些透明的DIV并查看文本的放置位置?
一点背景.Unicode 5.2增加了Avestan字母表支持.因此,如果浏览器支持Unicode 5.2,它会将U + 10B00等字符视为RTL(目前只有Firefox支持).否则,它会将这些字符视为LTR,因为这是默认值.
我如何以编程方式检查这个?我正在写一个Avestan输入脚本,如果浏览器太笨,我想覆盖bidi方向.但是,如果浏览器确实支持Unicode,则不应覆盖bidi设置(因为这将允许混合Avestan和Cyrillic).
我目前这样做:
var ua = navigator.userAgent.toLowerCase();
if (ua.match('webkit') || ua.match('presto') || ua.match('trident')) {
var input = document.getElementById('orig');
if (input) {
input.style.direction = 'rtl';
input.style.unicodeBidi = 'bidi-override';
}
}
Run Code Online (Sandbox Code Playgroud)
但是,显然,在Chrome和Opera开始支持Unicode 5.2之后,这会使脚本不太可用.
似乎字符类型的组合可能会对显式粘贴操作的结果顺序产生意外结果:
(x = paste(c('green','????', '????'), collapse=' ')) # arabic for blue and red
#> [1] "green ???? ????"
paste(x, 'yellow')
#> [1] "green ???? ???? yellow"
paste(x, 123)
#> [1] "green ???? ???? 123"
Run Code Online (Sandbox Code Playgroud)
有没有任何已知的解决方案 - 即确保连接的顺序与给出的参数相同?也许答案是不要连接不同的字母表!
我正在使用PHPWord模板处理器在模板中插入一些文本.
单词模板格式为LTR,因为所有标签都是英文.
这是单词模板中的行:
User Name: ${name}
Run Code Online (Sandbox Code Playgroud)
以下是替换值的PHP行:
$template->setValue('name', $user->name);
Run Code Online (Sandbox Code Playgroud)
这句话是双向的.标签为英文(LTR),用户名始终为阿拉伯语(RTL).
解压缩word文件后,这是document.xml中生成的代码行:
<w:r><w:rPr><w:b/><w:bCs/><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t>User Name:</w:t></w:r><w:r><w:rPr><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t xml:space="preserve"> ???? ????</w:t><w:tab/></w:r>
Run Code Online (Sandbox Code Playgroud)
替换的文本在LibreOffice中正确显示RTL,但在Microsoft Word中显示为LTR(反转).
我该怎么做才能使它在Microsoft Word中正确显示(RTL)?
Android 4.2引入了RTL(BiDi)支持,开始使用它我只需按照说明(android:supportsRtl属性到清单文件中的元素并将其设置为"true")
但是,我的ActionBar徽标也会改变方向(右侧显示徽标),这是我不想要的.我确实想使用RTL功能,但将ActionBar保持在左侧...
换句话说,当语言方向为RTL时,如何使用android:supportsRtl属性而不更改Android 4.2上的ActionBar方向
有什么建议 ?
bidi ×10
unicode ×3
android ×2
arabic ×2
css ×2
html ×2
c# ×1
direction ×1
javascript ×1
localization ×1
ms-word ×1
multilingual ×1
nameerror ×1
persian ×1
php ×1
phpword ×1
python ×1
python-3.x ×1
r ×1
rendering ×1