Clips.NET编码问题。字符串西里尔文字不可读

时间:2019-04-05 17:39:12

标签: clips

我正在尝试使用CLIPS.NET将CLIPS专家系统与.Net App集成。问题是我使用的一些事实包括一些西里尔字母。

当我将结果从Clips返回到.Net应用程序时。所有西里尔字母都被打乱了(见下图)。

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);
            }

我该怎么做才能正确获得它们? Clips IDE 6.4可以正常工作,并且可以正确显示这些字符串

谢谢!

1 个答案:

答案 0 :(得分:1)

这是将C UTF-8字符串转换为.NET字符串的代码中的错误。要解决此问题,您需要在CLIPSNET_Values.cpp文件中对SingleFieldToPrimitiveValue方法进行更改。替换这些行:

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