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文档中搜索非英语单词?
针对文本文件进行了如下解析。有谁知道如何处理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;
}
}