使用 Windows 范围内的 beta UTF-8 支持功能时在 Winforms 中调整 RTF 时出现的错误

2023-12-31

我想我在 Windows 或 .NET 中发现了一个错误,并且正在寻找解决方法。

要重现该问题,请首先启用 Windows 功能“Beta:使用 Unicode UTF-8 获得全球语言支持”。

您可能需要重新启动机器。

现在只需在Winforms/C#中创建两个RichTextBox组件,然后添加事件:

    private void richTextBox1_TextChanged(object sender, EventArgs e)
    {
        string s = richTextBox1.Rtf;
        richTextBox2.Rtf = s;
    }

最后,运行该程序并只需在第一个 RichTextBox 中键入一些内容,当它尝试写入时,它将崩溃并显示消息“文件格式无效”richTextBox2.Rtf。如果禁用 Windows 功能“Beta:使用 Unicode UTF-8 获得全球语言支持”,它不会崩溃。

我在这里考虑两种可能的解决方法:

1:以某种方式在 C# 应用程序中禁用整个“Beta:使用 Unicode UTF-8 实现全球语言支持”功能,并假装它从未启用过。

2:以某种方式编辑 RTF 字符串,以符合新 RTF 在调整其他 RichTextBox 的 RTF 之前应具有的任何未知要求。考虑到第一个 RichTextBox 应该具有完全相同的 RTF,这似乎违反直觉,但无论如何......


************* Exception Text **************
System.ArgumentException: File format is not valid.
at System.Windows.Forms.RichTextBox.StreamIn(Stream data, Int32 flags)
at System.Windows.Forms.RichTextBox.StreamIn(String str, Int32 flags)
at System.Windows.Forms.RichTextBox.set_Rtf(String value)
at unicodeTesting.Form1.richTextBox1_TextChanged(Object sender, EventArgs e) in D:\Code\c#\_tests\unicodeTesting\Form1.cs:line 30
at System.Windows.Forms.Control.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.WmReflectCommand(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.RichTextBox.WmReflectCommand(Message& m)
at System.Windows.Forms.RichTextBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Microsoft 开源了 WinForms 库,因此您可以自己深入研究源代码:

https://github.com/dotnet/winforms/tree/master/src/System.Windows.Forms/src/System/Windows/Forms https://github.com/dotnet/winforms/tree/master/src/System.Windows.Forms/src/System/Windows/Forms

StreamIn方法位于第3140行https://github.com/dotnet/winforms/blob/master/src/System.Windows.Forms/src/System/Windows/Forms/RichTextBox.cs https://github.com/dotnet/winforms/blob/master/src/System.Windows.Forms/src/System/Windows/Forms/RichTextBox.cs:

 private void StreamIn(string str, int flags)
    {
        if (str.Length == 0)
        {
            // Destroy the selection if callers was setting
            // selection text
            //
            if ((RichTextBoxConstants.SFF_SELECTION & flags) != 0)
            {
                SendMessage(Interop.WindowMessages.WM_CLEAR, 0, 0);
                ProtectedError = false;
                return;
            }
            // WM_SETTEXT is allowed even if we have protected text
            //
            SendMessage(Interop.WindowMessages.WM_SETTEXT, 0, "");
            return;
        }

        // Rather than work only some of the time with null characters,
        // we're going to be consistent and never work with them.
        int nullTerminatedLength = str.IndexOf((char)0);
        if (nullTerminatedLength != -1)
        {
            str = str.Substring(0, nullTerminatedLength);
        }

        // get the string into a byte array
        byte[] encodedBytes;
        if ((flags & RichTextBoxConstants.SF_UNICODE) != 0)
        {
            encodedBytes = Encoding.Unicode.GetBytes(str);
        }
        else
        {
            encodedBytes = Encoding.Default.GetBytes(str);
        }
        editStream = new MemoryStream(encodedBytes.Length);
        editStream.Write(encodedBytes, 0, encodedBytes.Length);
        editStream.Position = 0;
        StreamIn(editStream, flags);
    }

    private void StreamIn(Stream data, int flags)
    {
        // clear out the selection only if we are replacing all the text
        //
        if ((flags & RichTextBoxConstants.SFF_SELECTION) == 0)
        {
            NativeMethods.CHARRANGE cr = new NativeMethods.CHARRANGE();
            UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), Interop.EditMessages.EM_EXSETSEL, 0, cr);
        }

        try
        {
            editStream = data;
            Debug.Assert(data != null, "StreamIn passed a null stream");

            // If SF_RTF is requested then check for the RTF tag at the start
            // of the file.  We don't load if the tag is not there
            // 
            if ((flags & RichTextBoxConstants.SF_RTF) != 0)
            {
                long streamStart = editStream.Position;
                byte[] bytes = new byte[SZ_RTF_TAG.Length];
                editStream.Read(bytes, (int)streamStart, SZ_RTF_TAG.Length);
                string str = Encoding.Default.GetString(bytes);
                if (!SZ_RTF_TAG.Equals(str))
                {
                    throw new ArgumentException(SR.InvalidFileFormat);
                }

                // put us back at the start of the file
                editStream.Position = streamStart;
            }

            int cookieVal = 0;
            // set up structure to do stream operation
            NativeMethods.EDITSTREAM es = new NativeMethods.EDITSTREAM();
            if ((flags & RichTextBoxConstants.SF_UNICODE) != 0)
            {
                cookieVal = INPUT | UNICODE;
            }
            else
            {
                cookieVal = INPUT | ANSI;
            }
            if ((flags & RichTextBoxConstants.SF_RTF) != 0)
            {
                cookieVal |= RTF;
            }
            else
            {
                cookieVal |= TEXTLF;
            }
            es.dwCookie = (IntPtr)cookieVal;
            es.pfnCallback = new NativeMethods.EditStreamCallback(EditStreamProc);

            // gives us TextBox compatible behavior, programatic text change shouldn't
            // be limited...
            //
            SendMessage(Interop.EditMessages.EM_EXLIMITTEXT, 0, int.MaxValue);



            // go get the text for the control
            // Needed for 64-bit
            if (IntPtr.Size == 8)
            {
                NativeMethods.EDITSTREAM64 es64 = ConvertToEDITSTREAM64(es);
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), Interop.EditMessages.EM_STREAMIN, flags, es64);

                //Assign back dwError value
                es.dwError = GetErrorValue64(es64);
            }
            else
            {
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), Interop.EditMessages.EM_STREAMIN, flags, es);
            }

            UpdateMaxLength();

            // If we failed to load because of protected
            // text then return protect event was fired so no
            // exception is required for the the error
            if (GetProtectedError())
            {
                return;
            }

            if (es.dwError != 0)
            {
                throw new InvalidOperationException(SR.LoadTextError);
            }

            // set the modify tag on the control
            SendMessage(Interop.EditMessages.EM_SETMODIFY, -1, 0);

            // EM_GETLINECOUNT will cause the RichTextBoxConstants to recalculate its line indexes
            SendMessage(Interop.EditMessages.EM_GETLINECOUNT, 0, 0);


        }
        finally
        {
            // release any storage space held.
            editStream = null;
        }
    }

它看起来确实是一个错误,由于它是测试版,所以最好的做法是通过 Microsoft 记录它:https://developercommunity.visualstudio.com https://developercommunity.visualstudio.com

如果您将 RichTextBox 控件类替换为库中的代码,您将能够看到错误发生在哪一行:

System.Windows.Forms.RichTextBox.StreamIn(Stream data, Int32 flags)

Update:

这实际上是一个已知问题,https://social.msdn.microsoft.com/Forums/en-US/28940162-5f7b-4687-af19-1eeef90d3963/richtextboxrtf-setter- throwing-systemargumentexception-file-format-is-not-valid-in-windows?论坛=winforms https://social.msdn.microsoft.com/Forums/en-US/28940162-5f7b-4687-af19-1eeef90d3963/richtextboxrtf-setter-throwing-systemargumentexception-file-format-is-not-valid-in-windows?forum=winforms

已经向微软报告:https://developercommunity.visualstudio.com/content/problem/544623/issue-caused-by-unicode-utf-8-for-world-wide-langu.html https://developercommunity.visualstudio.com/content/problem/544623/issue-caused-by-unicode-utf-8-for-world-wide-langu.html

MSFT 的 Kyle Wang 已将问题范围缩小到操作系统问题:

PC1(操作系统版本 .437 可以重现该问题):

Env:

Test:
enter image description here

PC2(操作系统版本 .348 无法重现该问题):

Env:

Test:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Windows 范围内的 beta UTF-8 支持功能时在 Winforms 中调整 RTF 时出现的错误 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在Vim中正确显示UTF-8字符

    我想要 需要编辑包含 UTF 8 字符的文件 并且我想使用 Vim 在我被指责问以前问过的问题之前 我已经阅读了有关编码 文件编码 s 术语编码等的 Vim 文档 用 google 搜索了该主题 并阅读这个问题 https stackove
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 将 System.Windows.Forms.Keys 序列转换为 Char

    有没有办法转换由 Keys 枚举表示的击键序列 即System Windows Forms Keys 在一个字符中 例如 Keys Oem4进而Keys A产生 char 它一定存在于 WinAPI 中的某个地方 因为当我在文本框中按下按键
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • CSS 3 - 缩放过渡在谷歌浏览器中恢复

    我有一个问题 我有以下代码 用于使用 CSS3 过渡来增加比例 最后它在增加后恢复到原始比例 CSS big transition all 0 3s ease in out display inline big hover webkit t
  • 无法在 Windows Server 2008 SP2 上启用 TLS 1.2

    我们最近将 Java 版本升级到JDK 1 8 0 141这迫使我们的 java 客户端使用TLS 1 2我们有一个 Net 2 0Web 服务运行在Windows Server 2008 SP2仅支持SSL V3 and TLS 1 0
  • 单行水平滚动/可滑动 GridView

    我想要一个可以通过鼠标和触摸滑动水平滚动的单行 GridView GridView是通过绑定来呈现图像 以便从图像数组中选择单个图像 除了水平滚动不起作用之外 一切都工作正常 装订 图像选择等 XAML 代码如下所示 我缺少什么
  • Springfox swagger-ui 3.0.0 不显示 swagger-ui.html 页面

    我将 springfox swagger ui 与 Springboot 结合使用 但未启用分段上传的 fileUpload 按钮 我尝试升级到 springfox swagger ui 3 0 0 但这甚至没有打开 swagger ui
  • 从基于 Linux 的 C 程序打开并读取 Excel?

    我正在尝试找到一组源代码 这些源代码允许我从 C 程序中打开并读取 Linux 上的 Excel 文件的内容 如果我能找到只做这两件事的东西 我真的不想将它链接到 OpenOffice SDK carl 如果以下内容适合您 那么您可以从以下
  • 连接字符串错误(错误:40)

    我已在 Windows Server 2008 计算机上安装了 SQL Server 2012 Express 机器的名称是 THEMACHINE 安装时 我将 SQL Server 2012 设置为 默认实例 现在我像这样设置连接字符串
  • Travis.yml 因内容简约而失败?

    我有当前的travis yml在我的 Github 上 see http about travis ci org docs user languages php for more hints language php list any PH
  • 使用 :after CSS 伪元素而不插入内容

    是否可以使用 afterCSS 伪元素用于偏移对齐 而不实际插入任何内容content 除非指定内容 否则它似乎不会呈现 所以只是想知道这是否可能或者是否有任何已知的解决方法 举个例子 nav primary li level0 a aft
  • 如何将PHP变量中的NULL值插入MySQL,远离SQL注入?

    我有一个歌曲上传表单 我不会直接在 MySQL 中输入 NULL 值 例如 mysql query INSERT INTOsongs album id VALUES NULL 我会将 NULL 从 PHP 变量插入到 MySQL 并且肯定不
  • 如何从 DLL 返回实例?

    我正在编写一个DLL 我必须将 TBitmap 的实例返回到主机应用程序 DLL还有另一个UNIT 它是一个Form 它有一个TImageList用于存储图像 我编写了一个函数 想要从 TImageList 返回一个图像 从 DLL 到主机
  • 为什么我可以轻松解码 jwt.io 上的 auth0 id_token?

    好的 我正在开发一个 Angular 2 应用程序 我添加了 auth0 身份验证 但对我来说 它处理会话的方式非常不安全 jwt 令牌未加密并保存在 localStorage 中 这些声明对任何人来说都是可见的 它们可以很容易地被解码和揭
  • Silverlight 中的 SHA512 不可用,是否有可用的托管库?

    SHA512ManagedSilverlight 适用于 Windows Phone 7 CTP SDK 中缺少该功能 最多只能使用 SHA256 有谁知道我可以使用的 NET 类提供独立的 C 或 VB net SHA512 实现 我需要
  • 如何在控制台中检查 Ember.js 对象?

    有没有什么方法可以获取 Ember js 对象在 JavaScript 控制台中真正包含的内容 如果你这样做console log this 您将获得几乎所有对象几乎相同的数据结构 如下所示 这并不是很有帮助 而且它让您不知道对象上实际设置
  • 奇怪的构造函数

    好吧 我在这里会很简单 我只有一段 C 代码 我不确定我是否真的理解并且需要一些帮助 好吧 为了简单起见 我有一个定义如下的类 真正的类有点复杂 但这才是重要的 class myClass public Runnable Semaphore
  • html textArea 使用 Angular 调整大小事件

    我有一个类似行的布局 在行上 嵌入的 div 中有几个文本区域 如下所示 div class row 192 div class inner p text p div div
  • 我的 Google Compute Engine 实例上偶尔出现 Google 404

    我在 GCE 实例上托管一个网站 我将domain com 的DNS 指向我在Google Cloud 上保留的静态IP 该实例在端口 80 上运行 nginx 并将请求转发到在 8080 上运行的节点应用程序 它已经顺利运行了几个月 但今
  • 使用 Google Analytics trackPageview() 跟踪外部链接不起作用

    我已将外部链接跟踪设置为 Google Analytics 中的目标 根据 这是有问题的页面 http playmoreatthey org http playmoreatthey org 页面上的外部链接的格式如下 a href http
  • SCP说文件已下载,但文件没有出现

    我正在使用 ssh 在远程服务器上工作 但是当我尝试使用 scp 以这种格式下载文件时 scp email protected cdn cgi l email protection somefile zip Desktop 它询问我的密码
  • 如何通过Selenium打开Chrome浏览器控制台?

    我想通过按键盘按键打开 Chrome 浏览器控制台Ctrl Shift j在硒网络驱动程序中 我可以使用以下方法执行此操作Robot类 但我想要这个没有Robot班级 我已经使用了使用 sendKeys 的 Actions 类和 Keys
  • 使用 Windows 范围内的 beta UTF-8 支持功能时在 Winforms 中调整 RTF 时出现的错误

    我想我在 Windows 或 NET 中发现了一个错误 并且正在寻找解决方法 要重现该问题 请首先启用 Windows 功能 Beta 使用 Unicode UTF 8 获得全球语言支持 您可能需要重新启动机器 现在只需在Winforms