Проблема кодирования Clips.NET. Строковые кириллические факты не читаются - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь использовать CLIPS.NET для интеграции моей экспертной системы CLIPS с .Net App. Проблема в том, что некоторые из моих фактов, которые я использую, включают в себя некоторые кириллические строки.

Когда я вернул результат в приложение .Net из Clips. Все кириллические строки скремблированы (см. Рисунок ниже).

csharp clips

Пример кода (здесь fullName содержит символы кириллицы):

String findAllActiveMembers = "(find-all-facts ((?f  Member )) (= ?f:isActive 1))";
            MultifieldValue members = (MultifieldValue)clips.Eval(findAllActiveMembers);
            foreach (FactAddressValue member in members) {
                SymbolValue tag = (SymbolValue)member.GetSlotValue("tagName");
                StringValue fullName = (StringValue)member.GetSlotValue("fullName");
                this.factList.Items.Add(tag.Value + " " + fullName.Value);
            }

Что я могу сделать, чтобы получить их правильно? Клипы IDE 6.4 работает нормально и показывает эти строки правильно

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2019

Это ошибка в коде, который преобразует строки C UTF-8 в строки .NET. Чтобы это исправить, вам нужно внести изменения в метод SingleFieldToPrimitiveValue в файле CLIPSNET_Values.cpp. Замените эти строки:

rv = gcnew StringValue(gcnew String(theCString));
   .
   .
   .
rv = gcnew SymbolValue(gcnew String(theCString));
   .
   .
   .
rv = gcnew InstanceNameValue(gcnew String(theCString));

С этим:

rv = gcnew StringValue(gcnew String(theCString,0,strlen(theCString),UTF8Encoding::UTF8));
   .
   .
   .
rv = gcnew SymbolValue(gcnew String(theCString,0,strlen(theCString),UTF8Encoding::UTF8));
   .
   .
   .
rv = gcnew InstanceNameValue(gcnew String(theCString,0,strlen(theCString),UTF8Encoding::UTF8));

Вы также можете скачать файл здесь: https://sourceforge.net/p/clipsrules/code/HEAD/tree/branches/64x/windows/MVS_2017/CLIPSCLRWrapper/Source/Integration/CLIPSNET_Values.cpp

...