2012-04-24 1 views
4

Я тестирую SDK, который извлекает текст из PDF с возможностью поиска. Одна из зависимостей SDK была недавно обновлена, и это приводит к сбою существующего теста на тексте на иврите. Я не знаю иврита и не достаточно о том, как задействованные технологии представляют языки справа налево.Правильная последовательность символов на иврите в C# и файлы PDF с возможностью поиска

Тест NUnit утверждает, что извлеченный текст соответствует строке C# «מנבוצץז».

string hebrewText = reader.ReadToEnd(); 
Assert.AreEqual("מנבוצץז ", hebrewText); 

Растрированный PDF имеет то, что, по моему мнению, является одним и тем же персонажем, но в обратном порядке.

тест

enter image description here

Устройство не может с этим сообщением:

ОЖИДАЕТСЯ: "מנבוצץז"

Но было: "זץצובנמ"

Хотя фактический результат более тесно соответствует тому, что я вижу в растрированном PDF-файле, я не совсем уверен, что исходный тест неверен.

  1. Являются ли символы на иврите в строке C#, которые должны быть прочитаны справа налево, как напечатанный текст на иврите?
  2. Влияет ли какая-либо часть стека .NET с направлением ивритских строк?
  3. Что относительно NUnit?
  4. Являются ли символы на иврите встроенными в PDF с возможностью поиска, которые обычно должны идти в том же направлении, что и растрированный текст?
  5. Что-нибудь еще, что я должен знать, прежде чем принимать решение об «исправлении» этого модульного теста?
+2

Я не уверен, но в любом случае вы должны использовать перегрузку с CultureInfo и указать это (что-то вроде 'Assert.AreEqual (« מנבוצץז », hebrewText, false, new CultureInfo (« he-IL »)) '). Это должно хотя бы сказать, что он должен учитывать RTL. Не уверен, что делает дефолт, но скорее всего он будет использовать 'InvariantCulture', а не systeminfoinfo системы. – Jcl

+0

Спасибо за подсказку. Я попытался изменить утверждение на Assert.AreEqual («מנבוצץז», hebrewText.ToString (новый CultureInfo («he-IL»))) ;, но это не повлияло на результат. Я также попробовал культуру «он» с тем же результатом. –

ответ

4

Существуют различные способы кодирования языков RTL. Наиболее распространенным способом (и по умолчанию окна) является использование логического порядка, что означает, что первая буква кодируется как первый символ в строке (или файле). Таким образом, визуально первая буква появляется слева или справа от экрана, не влияет на порядок их хранения.

Теперь, что касается текста, появляющегося в Visual Studio, это зависит от версии. Насколько я помню, до Visual Studio 2010 редактор кода отображал иврит в обратном порядке, и было очевидно, что когда вы пытались выбрать текст на иврите, он менялся нечетным образом (что было визуально запутанным).Похоже, эта проблема больше не существует, это Visual Studio 2010 (по крайней мере, с SP1, который я только что проверил).

Давайте еврейское слово, для которого направление является более ясно, не говорящим на иврите, чем строки, указанной в тексте:

יון

Слово случается древнееврейское слово для иона, и на вашем экране он должен выглядеть как три буквы, где самая высокая буква слева, а кратчайшая - справа. В строке .NET выражение "יון".Substring(0, 1) произведет короткую букву, так как это первая буква в строке. Строка также может быть записана как "\u05D9\u05D5\u05DF", где самый левый символ Юникода \u05D9 представляет собой короткую букву, отображаемую справа, что наглядно демонстрирует порядок хранения букв.

Поскольку строка в вашем тестовом примере бессмысленна, я не могу сказать вам, было ли это неправильным тестом все время или если это правильный тест, который должен пройти. Если изображение, которое вы загрузили, было правильно обработано, значит, фактический результат вашего теста правильный, а ожидаемое значение неверно, и поэтому вы должны исправить тест.

1
  1. Я считаю, что все строки в C# будут храниться внутри LTR; Строки RTL будут иметь непечатаемый символ (или что-то еще), означающее, что они действительно RTL.
  2. Скорее всего. RTL GUI и визуализированный текст, например, нуждаются в определенных свойствах (в частности RightToLeft и RightToLeftLayout), которые должны быть установлены для правильного отображения.
  3. NUnit не должен. Не стоит заботиться. ИМХО - обратная строка! = Исходная строка.
  4. Я не мог комментировать. Я бы предположил, что они должны быть тем, что ожидает тест, предполагая, что это происходит сначала.
  5. Не делайте половинных измерений с помощью RTL, это действительно не нравится. Либо есть полная поддержка RTL, либо ничего. Это может быть довольно неприятно, я желаю вам удачи!