关于我对convert的一点自己操实例(ICONConvert字符矢量图)

关于Convert的转换器的工功能介绍:
在 WPF 中,Converter 通常用于在数据绑定过程中执行值的转换。你可以创建自定义的 Converter 类来实现数据的转换逻辑,然后在 XAML 中使用这个转换器。

创建一个继承自 ValueConverter接口的转换器类,实现 Convert 和 ConvertBack 方法。
以下是两个方法的操作的明细说明:

// 创建一个继承自 IValueConverter 接口的转换器类
public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 在这个方法中编写你的值的转换逻辑
        // value 参数表示绑定的值
        // targetType 参数表示目标属性的类型
        // parameter 参数表示传递的参数
        // culture 参数表示本地化信息
        // 返回转换后的值
        // 例如:将绑定的值转换为字符串并返回
        return value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 如果需要实现值的双向转换,可以在这个方法中编写逻辑
        // 例如:将字符串值转换为特定类型的值并返回
        return System.Convert.ChangeType(value, targetType);
    }
}

在 XAML 中,声明 Converter,并将它应用到数据绑定中

<Window.Resources>
    <local:MyConverter x:Key="myConverter" /> <!-- 声明 Converter -->
</Window.Resources>

...

<TextBlock Text="{Binding MyValue, Converter={StaticResource myConverter}}" />

数据绑定时,值会先经过 Converter 的转换逻辑,然后再显示在 TextBlock

另外 关于字符矢量图的一部分说明:操作软件:FontCreator
在xaml下面与后台系统识别的UNCOde数据是不一样的,所以需要中间转换 在XAML下识别的数据是在这里插入图片描述
首先$后面的额数据都是一样的:
在XAML下应该是识别是"Content= “&#xe627;后面可以是其他字符",其中原因是:XAML下不能识别 “\” 需要使用"&#"来进行转义,所以实际起作用的是 “xe627”;也就是原来的数据为\xe627
后台输入的方法 则不同,方式是’This.BT.Tag = "\ue627’;
其中 使用转换的方法是:

 /// <summary>
        /// Unicode 转 字符串
        /// </summary>
        /// <param name="unicodeStr"></param>
        /// <returns></returns>
        public string UnicodeToStr(string unicodeStr)
        {
            string outStr = "";
            if (!string.IsNullOrEmpty(unicodeStr))
            {
                string[] strlist = unicodeStr.Replace("&#", "").Replace(";", "").Split('x');
                try
                {
                    for (int i = 1; i < strlist.Length; i++)
                    {
                        outStr += (char)int.Parse(strlist[i], System.Globalization.NumberStyles.HexNumber);
                    }
                }
                catch (FormatException ex)
                {
                    outStr = ex.Message;
                }
            }
            return outStr;
        } 

针对当前这个转换器的操作是:

 [ValueConversion(typeof(int), typeof(String))]
    public class ICOConverter : IValueConverter
    {
        /// <summary>
        /// 将Unicode编码转换为汉字字符串
        /// </summary>
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string str = System.Convert.ToString(value);
            string un = string.Empty;
            MatchCollection mc = Regex.Matches(str, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);//这个正则要求要有两个"\\"
            byte[] bts = new byte[2];
            foreach (Match m in mc)
            {
                bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);
                bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
                un += Encoding.Unicode.GetString(bts);
            }

            return un;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

所以在指定规则返回数据的时候需要 加入两个"\\"这个正则才能识别的到。
故需要绑定数据时间:

            ThisModel thisModelone = new ThisModel();
            thisModelone.ThisICON = "\\ue627";
            thisModelone.ThisSetName = "测试";
            ThisTest.DataContext = thisModelone;

写在对应的XAML下才能识别为:


 <Window.Resources>  
        <ResourceDictionary> 
            <Converters:ICOConverter x:Key="sefg"/>//引入
        </ResourceDictionary> 
    </Window.Resources>

<Button Name="ThisTestBT" Grid.Column="1"  Tag="{Binding ThisICON,Converter={StaticResource sefg}}" Style="{DynamicResource NormalButton}"   Background="Transparent" Foreground="Blue"  Click="BTTest_Click" > 
                测试按钮
            </Button>//使用

就可以得到结果

另一篇关于 js与后端数据出现编码不同的乱码也是一样的道理
在做网页爬虫时难免会遇到编码乱码或需要编码转换的问题Unicode编码、json编码转中文
Unicode编码转中文

private string NormalU2CC(string str)//”string str”指待传入的字符串
{
string r = "";
MatchCollection mc = Regex.Matches(str, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
byte[] bts = new byte[2];
foreach (Match m in mc)
{
bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);
bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
r = Encoding.Unicode.GetString(bts);
Regex regex = new Regex(@"\\u" + m.Groups[1].Value + m.Groups[2].Value, RegexOptions.IgnoreCase);
str = regex.Replace(str, r);
}
return str;
}

json字符串转中文

/// json字符串转中文需要先将编码转换为Unicode编码之后在通过Unicode编码转为中文
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private string JsonToUnicode(string input)
{
input = input.Replace("\\\"", "\"");
input = input.Replace("\\/", "/");
string result;
if (!input.Contains("\\u"))
{
result = input;
}
else
{
StringBuilder stringBuilder = new StringBuilder();
if (input.IndexOf("\\u") > 0)
{
stringBuilder.Append(input.Substring(0, input.IndexOf("\\u")));
input = input.Substring(input.IndexOf("\\u"));
}
if (!string.IsNullOrEmpty(input))
{
string[] array = input.Split(new string[] { "\\u" }, StringSplitOptions.RemoveEmptyEntries);
string[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
string text = array2[i];
if (text.Length > 4)
{
string arg = text.Substring(4);
stringBuilder.Append((char)int.Parse(text.Substring(0, 4), NumberStyles.HexNumber) + arg);
}
else
{
if (text.Length == 4)
{
stringBuilder.Append((char)int.Parse(text, NumberStyles.HexNumber));
}
else
{
if (text.Length < 4 && text.Length > 0)
{
stringBuilder.Append(text);
}
}
}
}
}
result = stringBuilder.ToString();
}
return result;
}

参考文档:https://www.cnblogs.com/Juliet1018/p/7016137.html
也是同一个原因操作

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值