![Скрытые символы форматирования в MS Word](https://rvso.com/image/1395380/%D0%A1%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B5%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20MS%20Word.png)
У меня есть документ Word на персидском языке, и в нем много фраз, подобных этой:
Моя проблема в том, где «و نشیب» соединяется с «هایی».
Сначала кажется, что между ними находится несоединительный символ нулевой ширины, но на самом деле, когда я попытался его скопировать, ничего не скопировалось.
Я также скопировал всю фразу в Блокнот и у меня получилось следующее: «و نشیبهایی». Как видите, между двумя предыдущими словами ничего нет.
Я включил функцию «Показать/скрыть ¶» в группе «Абзац» на вкладке «Главная», чтобы проверить, нет ли скрытых символов, и вот результат:
Теперь мне интересно, есть ли способ работать с этим персонажем, например, заменить его на ZWNJ.
Файл с этой проблемой(также читайте ниже)
решение1
Это полная замена моего оригинального ответа (исходный текст приведен ниже).
В вашем документе слова помечены зеленым («слова, которые копируют так, как вам нужно») и красным («слова, которые не копируют так, как вам нужно»).
Оба типа используют ZWNJ, например, перед символом Хе, который должен присоединяться только слева, а не справа.
Разница в том, что в зеленых словах ZWNJ вводится справа налево, а в красных — слева направо.
Я не знаю, как вы обычно вводите ZWNJ, но здесь, если я выбираю "No-width Optional Break" на панели Special Characters в диалоговом окне Symbol, ZWNJ вводится LTR (плохо в данном случае), тогда как если я выбираю символ 0x200C из таблицы символов в диалоговом окне Symbol, он вводится RTL (хорошо в данном случае). В Word 2010, если я захожу в Word->File-Options->Customize Ribbon->Keyboard Shortcuts->Customize... и назначаю сочетание клавиш для No-Width Optional Break, нажатие этого сочетания клавиш при вводе текста RTL, по-видимому, вставляет ZWNJ как RTL (хорошо). Вы можете назначить это следующим образом:
- В списке категорий прокрутите вниз до пункта «Общие символы» и выберите его.
- В отобразившемся списке общих символов выберите «Необязательный разрыв без ширины».
- щелкните в поле «Нажмите новую горячую клавишу»
- нажмите нужную вам комбинацию клавиш (я использовал ctrl-9 в качестве эксперимента)
- нажмите «Назначить»
- нажмите Закрыть
Я не знаю, даст ли это вам все необходимое, но думаю, что это, по крайней мере, объясняет, что происходит.
(Я подозревал, что это что-то вроде этого, но мне пришлось сохранить как .docx и посмотреть XML. «Зеленые слова» были закодированы в одном «run» Word со «свойством run» RTL (run — это последовательность символов, которая имеет одинаковые характеристики, поэтому если вы измените цвет текста, появится новый run). Красные слова были закодированы как три run: два RTL-run, содержащие текст, и не-RTL-run, содержащий символ ZWNJ.)
Чтобы изменить LTR ZWNJ на RTL, вы должны уметь использовать следующий код VBA. (Для тех, кто знает VBA, это один из случаев, когда вам придется работать с Selection, а не Range, потому что, насколько мне известно, единственный способ задать Run для текста RTL — это использовать метод RTLRun объекта Selection):
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
Ниже приведен исходный текст моего ответа...
Это, вероятно,являетсяa ZWNJ . Если вы его выберете, а затем щелкните Вставка->Символ->Другие символы, должен быть выбран ZWNJ (0x200C). Это тот же символ, который Microsoft называет "No-Width Optional Break" на панели "Специальные символы" в диалоговом окне "Символ".
Насколько мне известно, NotePad игнорирует ZWNJ. Я подозреваю, что вам придется заменить ZWNJ (если это так) на пробел (выбранный, вы должны иметь возможность нажать клавишу пробела, чтобы сделать это), что заставит NotePad отобразить правильную форму символа.
Копирование из одной точки документа Word в другую должно сохранять ZWNJ, но это ли то, что вы видите?
решение2
Сегодня я нашел другой способ решения проблемы. Хитрость заключается в том, чтобы заменить NWOB (символом до и после) на себя самого, и тогда Word сделает свое дело...
- Найти то, что:
(?)^o(?)
- Заменить:
\1^o\2
- Не забудьте поставить галочку рядом
Use wildcards
сMore >>
панелью
Затем он изменит LTR ZWNJ на этот прямоугольный режим, а RTL — на то, что я ожидал.