我有一个波斯语的 Word 文档,其中有很多这样的短语:
我的问题是“و نشیب”与“هایی”的连接位置。
起初,它们之间似乎有一个零宽度非连接字符,但实际上,当我尝试复制它时,什么都没有复制。
我还将整个短语复制到记事本中,得到了这个:“و نشیبهایی”正如你所见,前面两个单词之间没有任何内容。
我打开了“主页”选项卡的“段落”组中的显示/隐藏¶ 来查看是否有任何隐藏字符,结果如下:
现在,我想知道是否有任何方法可以使用这个字符;例如用 ZWNJ 替换它。
存在该问题的文件(另请参阅下文)
答案1
这完全替代了我的原始答案(原文如下)。
您的文档将单词标记为绿色(“按您想要的方式复制的单词”)和红色(“不按您想要的方式复制的单词”)。
两种类型都使用 ZWNJ,例如,在 Heh 字符前面,该字符只能连接到左侧,而不能连接到右侧。
区别在于,在绿色字中,ZWNJ 已输入 RTL,但在红色字中,它已输入 LTR。
我不知道您通常如何输入 ZWNJ,但在这里,如果我从“符号”对话框中的特殊字符窗格中选择“无宽度可选分隔符”,则 ZWNJ 会以 LTR 输入(在本例中为坏的),而如果我从“符号”对话框中的字符表中选择字符 0x200C,则它会以 RTL 输入(在本例中为好的)。在 Word 2010 中,如果我进入 Word->文件选项->自定义功能区->键盘快捷键->自定义... 并为无宽度可选分隔符分配一个按键,则在输入 RTL 文本时按下该按键似乎会将 ZWNJ 插入为 RTL(好的)。您可以按如下方式分配它:
- 在类别列表中,向下滚动到“常用符号”并选择它
- 在显示的常用符号列表中,选择“无宽度可选中断”
- 点击“按新快捷键”框
- 按下你想要的快捷键(我使用 ctrl-9 作为实验)
- 点击分配
- 点击关闭
我不知道这是否能满足您的所有需求,但我认为它至少解释了发生了什么。
(我怀疑它是类似的东西,但我必须将其保存为 .docx 并查看 XML。“绿色单词”被编码为具有“运行属性”RTL 的单个 Word“运行”(运行是具有相同特征的字符序列,因此如果您更改文本颜色,就会有一个新的运行)。红色单词被编码为三个运行:两个包含文本的 RTL 运行和一个包含 ZWNJ 字符的非 RTL 运行。)
要将 LTR ZWNJ 更改为 RTL ZWNJ,您应该能够使用以下 VBA。(对于了解 VBA 的人来说,这是您必须使用 Selection 而不是 Range 的情况之一,因为据我所知,将 Run 设置为 RTL 文本的唯一方法是通过 Selection 对象的 RTLRun 方法):
Sub replace_LTR_NBZWs_with_RTL_ones()
ActiveDocument.Select
With Selection.Find
.ClearFormatting
.Text = ChrW(8204)
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchByte = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
While .Execute
Selection.RtlRun
Wend
End With
End Sub
我的回答原文如下……
可能是一个 ZWNJ 。如果选中它,然后单击“插入”->“符号”->“更多符号”,则应该选中 ZWNJ (0x200C)。它与 Microsoft 在“符号”对话框的“特殊字符”窗格中称为“无宽度可选分隔符”的字符相同。
据我所知,NotePad 会忽略 ZWNJ。我怀疑您必须用空格(选定一个,您应该可以按空格键来执行此操作)替换 ZWNJ(如果是的话),这样 NotePad 才能显示正确的字符形式。
从 Word 文档中的一个点复制到另一个点应该保留 ZWNJ,但这是您看到的吗?
答案2
今天我找到了另一种方法来解决这个问题。诀窍是将 NWOB(前后各一个字符)替换为其本身,然后 Word 就可以解决问题了……
- 找什么:
(?)^o(?)
- 用。。。来代替:
\1^o\2
Use wildcards
不要忘记在More >>
窗格旁边打勾
然后它会将 LTR ZWNJ 更改为矩形模式,并将 RTL 更改为我预期的模式。