Windows 搜索服务 - 以 ansi (代码页 1251) 格式保存的文本 - 搜索非英语符号不会给出任何结果

本文关键字:搜索 符号 英语 文本 结果 任何 格式 ansi 服务 代码 Windows | 更新日期: 2023-09-27 18:31:49

我已经将Windows搜索服务配置为索引测试文件夹c:''temp''test。有文件amsi.txt以ansi(代码页1251)格式保存,内容中有单词"子字符串"和"Россия"。当我搜索单词"子字符串"时 - 文件显示在结果中。当我搜索单词"россия"时 - 如果搜索结果,则不会显示任何内容。

与PDF文件的行为相同 - 有文件测试.pdf包含相同的单词。仅当我搜索"子字符串"单词时,搜索结果才包含此文件。

我已将搜索服务配置为始终在内容内搜索。我已将服务配置为索引.pdf和.txt扩展名的文件内容。之后我重新索引了文件夹。最新版本的pdf IFilter,适用于我的x64系统安装(来自Adobe)。

此外,我还实现了应用程序来重现情况,并使用指定为 1049 的 LCID 执行相关查询,并尝试将查询编码为 ansi(代码页 1251)。结果相同 - 在 pdf 和 ansi 测试文件中找不到俄语单词。

如何使用Windows搜索服务在ANSI或pdf文档中搜索非英语单词?

Windows 搜索服务 - 以 ansi (代码页 1251) 格式保存的文本 - 搜索非英语符号不会给出任何结果

针对文本文件进行了如下解析。有谁知道如何处理pdf?

我已经实现了以下丑陋的转换,并将字符串转换为搜索,就像它通过丑陋的Windows搜索服务(c#代码)所做的那样:

 public static class Helper
    {
        public static string UnicodeToUglycode(string unicodeString, string lang)
        {
            var ansiCodePage = GetCodepage(lang);
            var unicode = Encoding.Unicode;
            var ansi = Encoding.GetEncoding(ansiCodePage);
            var bytesUnicode = unicode.GetBytes(unicodeString);          
            var bytesansi = Encoding.Convert(unicode, ansi, bytesUnicode);
            // try udly recoding lie WSS
            var uglycode = AnsiToUglycode(bytesansi);
            return uglycode; 
        }        

        /// <summary>
        /// This is done as ugly Windows Search Service do
        /// </summary>
        /// <param name="answersiBytes">Correct ansi values</param>
        /// <returns>ugly converted to unicode string</returns>
        public static string AnsiToUglycode(byte[] ansiBytes)
        {
            var builder = new StringBuilder();
            for (int i = 0; i < ansiBytes.Length; i++)
            {
                var ch = ansiBytes[i].ToString("X2");
                ch = ch.Insert(0, "00");
                int value = Convert.ToInt32(ch, 16);
                builder.Append(Char.ConvertFromUtf32(value));                
            }
            var ugly = builder.ToString();
            return ugly;
        }    
        public static int GetLcid(string lang)
        {
            var cultureInfo = CultureInfo.GetCultureInfo(lang);
            return cultureInfo.TextInfo.LCID;
        }
        public static int GetCodepage(string lang)
        {
            var cultureInfo = CultureInfo.GetCultureInfo(lang);
            return cultureInfo.TextInfo.ANSICodePage;
        }
    }