C#/ Word:如何将两个字符串与wingdings字符进行比较?

时间:2016-02-10 04:03:08

标签: c# string ms-word compare wingdings

我想比较两个带有wingdings字符的字符串。因为我不知道如何在C#字符串中捕获wingdings代码,所以我不能在两个字符串之间进行可靠的比较...

上下文:C#/ Word

问题描述

我有一个带有复选框的word文档。这个复选框是一个翼。我的挑战是说是否使用C#检查了此复选框。

我知道如果被破坏的字符串等于其中一个强化字符&#120&#253&#254

,则会检查检查弓

see the list of wingdings

否则取消选中该复选框。

在您的帮助之后

在你的帮助之后,我解决了我的问题:),现在,我还有另一个问题:))

正如我在顶部所说的,所有这一切都是为了将​​翼形字符(复选框)与代表复选复选框的所有可能的翼形进行比较。现在,当我直接比较单词中的复选框和编码的翅膀时,我找不到该字符,因为它以其他格式编码...

但是当我创建一个单词文档并且我输入编码后的字符然后我将我创建的字符与目标单词doc进行比较我有什么想要的:)但是这个解决方案如你所见需要创建一个新单词doc :(

无论如何,这是我的解决方案:)

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Office.Interop.Word;

namespace Project0
{
    class Program
    {
        static bool isChecked(Range rng)
        {
            var wrdApp = new Application();
            wrdApp.Visible = true;
            Document wrdDoc = wrdApp.Documents.Add();
            Range Rngg = wrdDoc.Paragraphs[1].Range;
            Rngg.Font.Name = "WingDings";   // Why I CREATE A SECOND DOC - I Need this font ;(
            List<string> list = new List<string>{ "\u00fe", "\u00fd", "\u0078" };
            foreach (string k in list)
            {
                if (rng.Text.Contains(Rngg.Text))
                {
                    return true;
                }
            }
            return false;
        }

        static void Main(string[] args)
        {
            List<string> list = new List<string> { "\u00fe", "\u00fd", "\u0078" };

            //            string wPath = @"C:\DV\test.docx";
            //           Document wrdDoc = wrdApp.Documents.Open(FileName: wPath, ReadOnly: false);

            var wrdApp = new Application();
            wrdApp.Visible = true;
            Document wrdDoc = wrdApp.Documents.Add();

            // I SIMULATE MY DOC
            wrdDoc.Paragraphs[1].Range.Font.Name = "WingDings";
            wrdDoc.Paragraphs[1].Range.Text = list[1];  // I put a checked box

            // CAN I DETERMINE IF THERE IS A CHECKBOX
            if (isChecked(wrdDoc.Paragraphs[1].Range))
            {
                Console.WriteLine("Heeah, there's a checked checkbox !!");
            }
        }
    }
}

提前感谢您的所有帮助:)

2 个答案:

答案 0 :(得分:0)

当您比较字符串时,它们将按其值进行比较。

所以你可以在字符串变量中使用绕组来取你的字符串,然后使用string.comapare()方法来比较它。 但是,我认为你应该详细说明你的问题,并且会有答案。

答案 1 :(得分:0)

将字符串声明为

string x="♓■♑⬧♎♓■♑⬧";  //Wingdings characters

.NET将该字符串保存为 UTF-16编码的unicode代码点

因此,用于声明string字体或符号并不重要。即使您的计算机中没有要显示的正确字体文件,您仍然可以使用\u表示法保存字体值。这意味着直接编写unicode代码点:

类似的东西:

string test= "\u20AC";
//Also can be declared as: 
string test=     "€" 
//Both are same

因此,关键是,你仍然可以&#34;保存&#34;任何&#34;字符&#34;到你的string并进行比较。如果你想获得正确的整理顺序,你必须指定其他很多东西,如 culture 等。 但是,这是一个相当广泛的主题,不能在这个答案中写下所有内容。

有关string.compare

的更多详细信息/选项,请查看此msdn page

编辑 - &gt;更新后的问题:

假设您正在从 UTF-8 编码的源中读取值,您可以执行以下操作:

string yourSourceStringInUTF8="asdfasdýadfasdfasdf";
//These are the wingdings characters in UTF-8 encoded hex format 
List<string> list = new List<string> { "\u00fe", "\u00fd", "\u0078" };
bool found = false;
foreach (string s in list)
{
    found = yourSourceStringInUTF8.Contains(s);
    if (found)
    {
        break;
    }
}
Console.WriteLine(found? "found":"Notfound");

修改

有多种方法可以获取/尝试查找文件的编码。 有些是:


public static Encoding GetEncoding(string filename)
{
    // Read the BOM
    var bom = new byte[4];
    using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        file.Read(bom, 0, 4);
    }
// Analyze the BOM
    if (bom[0] == 0x2b && bom1 == 0x2f && bom2 == 0x76) return Encoding.UTF7;
    if (bom[0] == 0xef && bom1 == 0xbb && bom2 == 0xbf) return Encoding.UTF8;
    if (bom[0] == 0xff && bom1 == 0xfe) return Encoding.Unicode; //UTF-16LE
    if (bom[0] == 0xfe && bom1 == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
    if (bom[0] == 0 && bom1 == 0 && bom2 == 0xfe && bom[3] == 0xff) return Encoding.UTF32;
    return Encoding.ASCII;
}


      using (StreamReader reader = new StreamReader(fileName, defaultEncodingIfNoBom, true))
  {
      reader.Peek(); // you need this!
      var encoding = reader.CurrentEncoding;
  }

代码段取自此stackoverflow link