winforms 如何在包含utf8字符的富文本框中创建文件超链接?

mwyxok5s  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(168)

我有一个富文本框,我想在上面使用超链接,所以当用户单击它时,网站链接或本地文件就会打开。在我的最后一个问题中,我说链接点击事件没有正常触发,这个问题解决了,但现在我有另一个问题。
我尝试创建一个超链接,我的字符是utf8(波斯语/阿拉伯语)。但是举个例子,当我写这篇文章的时候
I don't know what I'm going to do. چه خبر؟
选择“”作为链接文本,选择“C:\Users\sadegh\Desktop\16.txt”作为url,结果是:
I don't know what I'm going to do.??file://C:/Users/sadegh/Desktop/16.txt
我该怎么解决这个问题?我的代码是:

private void AddLinkBtn_Click(object sender, EventArgs e)
{
    string url = null;
    
    OpenFileDialog openFileDialog = new OpenFileDialog();
    //openFileDialog.Filter = "Image Files (*.jpg;*.jpeg,*.png)|*.JPG;*.JPEG;*.PNG";
    openFileDialog.Multiselect = false;
    
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        url = openFileDialog.FileName;
    }
    
    if (!string.IsNullOrEmpty(url))
    {
        string linkText = TextBoxDefinition.SelectedText;
        byte[] bytes = Encoding.UTF8.GetBytes(linkText);
        linkText = Encoding.UTF8.GetString(bytes);
    
        TextBoxDefinition.SelectedRtf = @"{\rtf1\utf8\field{\*\fldinst HYPERLINK ""file://" + url.Replace("\\", "/") + @""" }{\fldrslt" + linkText + "}}";
    }
}

更新:我忘了说。.NET Framework 4.5。

d6kp6zgx

d6kp6zgx1#

您需要将波斯Unicode字符替换为它们的码点。例如,使用this post中的GetRtfUnicodeEscapedString方法,可以像这样插入链接:

private void button1_Click(object sender, EventArgs e)
{
    this.richTextBox1.SelectedRtf = @"{\rtf1" +
        @"{\field{\*\fldinst{HYPERLINK https://google.com }}{\fldrslt{" +
        GetRtfUnicodeEscapedString("سلام، من خوبم. تو خوبی؟ چه خبرا؟") +
        @"}}" +
        @"}}";
    this.richTextBox1.LinkClicked += (obj, args) =>
    {
        MessageBox.Show(args.LinkText);
    };
}
static string GetRtfUnicodeEscapedString(string s)
{
    var sb = new StringBuilder();
    foreach (var c in s)
    {
        if (c == '\\' || c == '{' || c == '}')
            sb.Append(@"\" + c);
        else if (c <= 0x7f)
            sb.Append(c);
        else
            sb.Append("\\u" + Convert.ToUInt32(c) + "?");
    }
    return sb.ToString();
}

相关问题