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

时间:2014-11-24 18:10:03

标签: c# windows pdf search text

我已将Windows搜索服务配置为索引测试文件夹c:\ temp \ test。文件amsi.txt以ansi(代码页1251)格式保存,内容中包含单词“substring”和“Россия”。当我搜索单词“substring”时 - 文件显示在结果中。当我搜索单词“россия”时 - 如果搜索结果没有显示。

PDF文件的相同行为 - 文件test.pdf包含相同的单词。仅当我搜索“substring”字时,搜索结果才包含此文件。

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

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

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

1 个答案:

答案 0 :(得分:0)

已解决文本文件,如下所示。有谁知道如何处理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="ansiBytes">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;
        }
    }